Commit 270aaa17 authored by joerg@trift2's avatar joerg@trift2

Merge trift2.:/MySQL/M50/mysql-5.0

into  trift2.:/MySQL/M50/push-5.0
parents 95c8fb8d 830096fe
...@@ -136,6 +136,8 @@ struct editline { ...@@ -136,6 +136,8 @@ struct editline {
protected int el_editmode(EditLine *, int, const char **); protected int el_editmode(EditLine *, int, const char **);
#define el_isprint(x) ((unsigned char) (x) < 0x80 ? isprint(x) : 1)
#ifdef DEBUG #ifdef DEBUG
#define EL_ABORT(a) do { \ #define EL_ABORT(a) do { \
fprintf(el->el_errfile, "%s, %d: ", \ fprintf(el->el_errfile, "%s, %d: ", \
......
...@@ -618,7 +618,7 @@ key__decode_char(char *buf, int cnt, int ch) ...@@ -618,7 +618,7 @@ key__decode_char(char *buf, int cnt, int ch)
} else if (ch == '\\') { } else if (ch == '\\') {
buf[cnt++] = '\\'; buf[cnt++] = '\\';
buf[cnt] = '\\'; buf[cnt] = '\\';
} else if (ch == ' ' || (isprint(ch) && !isspace(ch))) { } else if (ch == ' ' || (el_isprint(ch) && !isspace(ch))) {
buf[cnt] = ch; buf[cnt] = ch;
} else { } else {
buf[cnt++] = '\\'; buf[cnt++] = '\\';
...@@ -660,7 +660,7 @@ key__decode_str(const char *str, char *buf, const char *sep) ...@@ -660,7 +660,7 @@ key__decode_str(const char *str, char *buf, const char *sep)
} else if (*p == '^' || *p == '\\') { } else if (*p == '^' || *p == '\\') {
*b++ = '\\'; *b++ = '\\';
*b++ = *p; *b++ = *p;
} else if (*p == ' ' || (isprint((unsigned char) *p) && } else if (*p == ' ' || (el_isprint((unsigned char) *p) &&
!isspace((unsigned char) *p))) { !isspace((unsigned char) *p))) {
*b++ = *p; *b++ = *p;
} else { } else {
......
...@@ -961,7 +961,7 @@ map_init_nls(EditLine *el) ...@@ -961,7 +961,7 @@ map_init_nls(EditLine *el)
el_action_t *map = el->el_map.key; el_action_t *map = el->el_map.key;
for (i = 0200; i <= 0377; i++) for (i = 0200; i <= 0377; i++)
if (isprint(i)) if (el_isprint(i))
map[i] = ED_INSERT; map[i] = ED_INSERT;
} }
......
...@@ -508,7 +508,7 @@ el_gets(EditLine *el, int *nread) ...@@ -508,7 +508,7 @@ el_gets(EditLine *el, int *nread)
el->el_chared.c_redo.pos < el->el_chared.c_redo.lim) { el->el_chared.c_redo.pos < el->el_chared.c_redo.lim) {
if (cmdnum == VI_DELETE_PREV_CHAR && if (cmdnum == VI_DELETE_PREV_CHAR &&
el->el_chared.c_redo.pos != el->el_chared.c_redo.buf el->el_chared.c_redo.pos != el->el_chared.c_redo.buf
&& isprint((unsigned char)el->el_chared.c_redo.pos[-1])) && el_isprint((unsigned char)el->el_chared.c_redo.pos[-1]))
el->el_chared.c_redo.pos--; el->el_chared.c_redo.pos--;
else else
*el->el_chared.c_redo.pos++ = ch; *el->el_chared.c_redo.pos++ = ch;
......
...@@ -88,7 +88,7 @@ private void ...@@ -88,7 +88,7 @@ private void
re_addc(EditLine *el, int c) re_addc(EditLine *el, int c)
{ {
if (isprint(c)) { if (el_isprint(c)) {
re_putc(el, c, 1); re_putc(el, c, 1);
return; return;
} }
...@@ -964,7 +964,7 @@ re_refresh_cursor(EditLine *el) ...@@ -964,7 +964,7 @@ re_refresh_cursor(EditLine *el)
h = 1; h = 1;
v++; v++;
} }
} else if (!isprint((unsigned char) c)) { } else if (!el_isprint((unsigned char) c)) {
h += 3; h += 3;
if (h > th) { /* if overflow, compensate */ if (h > th) { /* if overflow, compensate */
h = h - th; h = h - th;
...@@ -1057,7 +1057,7 @@ re_fastaddc(EditLine *el) ...@@ -1057,7 +1057,7 @@ re_fastaddc(EditLine *el)
char mc = (c == '\177') ? '?' : (c | 0100); char mc = (c == '\177') ? '?' : (c | 0100);
re_fastputc(el, '^'); re_fastputc(el, '^');
re_fastputc(el, mc); re_fastputc(el, mc);
} else if (isprint((unsigned char) c)) { /* normal char */ } else if (el_isprint((unsigned char) c)) { /* normal char */
re_fastputc(el, c); re_fastputc(el, c);
} else { } else {
re_fastputc(el, '\\'); re_fastputc(el, '\\');
......
...@@ -270,6 +270,9 @@ MI_INFO *mi_open(const char *name, int mode, uint open_flags) ...@@ -270,6 +270,9 @@ MI_INFO *mi_open(const char *name, int mode, uint open_flags)
if (share->options & HA_OPTION_COMPRESS_RECORD) if (share->options & HA_OPTION_COMPRESS_RECORD)
share->base.max_key_length+=2; /* For safety */ share->base.max_key_length+=2; /* For safety */
/* Add space for node pointer */
share->base.max_key_length+= share->base.key_reflength;
if (!my_multi_malloc(MY_WME, if (!my_multi_malloc(MY_WME,
&share,sizeof(*share), &share,sizeof(*share),
&share->state.rec_per_key_part,sizeof(long)*key_parts, &share->state.rec_per_key_part,sizeof(long)*key_parts,
...@@ -791,8 +794,17 @@ static void setup_key_functions(register MI_KEYDEF *keyinfo) ...@@ -791,8 +794,17 @@ static void setup_key_functions(register MI_KEYDEF *keyinfo)
keyinfo->get_key= _mi_get_pack_key; keyinfo->get_key= _mi_get_pack_key;
if (keyinfo->seg[0].flag & HA_PACK_KEY) if (keyinfo->seg[0].flag & HA_PACK_KEY)
{ /* Prefix compression */ { /* Prefix compression */
/*
_mi_prefix_search() compares end-space against ASCII blank (' ').
It cannot be used for character sets, that do not encode the
blank character like ASCII does. UCS2 is an example. All
character sets with a fixed width > 1 or a mimimum width > 1
cannot represent blank like ASCII does. In these cases we have
to use _mi_seq_search() for the search.
*/
if (!keyinfo->seg->charset || use_strnxfrm(keyinfo->seg->charset) || if (!keyinfo->seg->charset || use_strnxfrm(keyinfo->seg->charset) ||
(keyinfo->seg->flag & HA_NULL_PART)) (keyinfo->seg->flag & HA_NULL_PART) ||
(keyinfo->seg->charset->mbminlen > 1))
keyinfo->bin_search=_mi_seq_search; keyinfo->bin_search=_mi_seq_search;
else else
keyinfo->bin_search=_mi_prefix_search; keyinfo->bin_search=_mi_prefix_search;
......
...@@ -13,6 +13,8 @@ ...@@ -13,6 +13,8 @@
SET @safe_character_set_server= @@character_set_server; SET @safe_character_set_server= @@character_set_server;
SET @safe_collation_server= @@collation_server; SET @safe_collation_server= @@collation_server;
SET @safe_character_set_client= @@character_set_client;
SET @safe_character_set_results= @@character_set_results;
SET character_set_server= @test_character_set; SET character_set_server= @test_character_set;
SET collation_server= @test_collation; SET collation_server= @test_collation;
CREATE DATABASE d1; CREATE DATABASE d1;
...@@ -62,8 +64,22 @@ select a sounds like a from t1; ...@@ -62,8 +64,22 @@ select a sounds like a from t1;
select 1 from t1 order by cast(a as char(1)); select 1 from t1 order by cast(a as char(1));
drop table t1; drop table t1;
#
# Bug#27580 SPACE() function collation bug?
#
set names utf8;
create table t1 (
name varchar(10),
level smallint unsigned);
show create table t1;
insert into t1 values ('string',1);
select concat(name,space(level)), concat(name, repeat(' ',level)) from t1;
drop table t1;
DROP DATABASE d1; DROP DATABASE d1;
# Restore settings # Restore settings
USE test; USE test;
SET character_set_server= @safe_character_set_server; SET character_set_server= @safe_character_set_server;
SET collation_server= @safe_collation_server; SET collation_server= @safe_collation_server;
SET character_set_client= @safe_character_set_client;
SET character_set_results= @safe_character_set_results;
...@@ -3,6 +3,8 @@ SET @test_character_set= 'big5'; ...@@ -3,6 +3,8 @@ SET @test_character_set= 'big5';
SET @test_collation= 'big5_chinese_ci'; SET @test_collation= 'big5_chinese_ci';
SET @safe_character_set_server= @@character_set_server; SET @safe_character_set_server= @@character_set_server;
SET @safe_collation_server= @@collation_server; SET @safe_collation_server= @@collation_server;
SET @safe_character_set_client= @@character_set_client;
SET @safe_character_set_results= @@character_set_results;
SET character_set_server= @test_character_set; SET character_set_server= @test_character_set;
SET collation_server= @test_collation; SET collation_server= @test_collation;
CREATE DATABASE d1; CREATE DATABASE d1;
...@@ -69,10 +71,27 @@ select 1 from t1 order by cast(a as char(1)); ...@@ -69,10 +71,27 @@ select 1 from t1 order by cast(a as char(1));
1 1
1 1
drop table t1; drop table t1;
set names utf8;
create table t1 (
name varchar(10),
level smallint unsigned);
show create table t1;
Table Create Table
t1 CREATE TABLE `t1` (
`name` varchar(10) default NULL,
`level` smallint(5) unsigned default NULL
) ENGINE=MyISAM DEFAULT CHARSET=big5
insert into t1 values ('string',1);
select concat(name,space(level)), concat(name, repeat(' ',level)) from t1;
concat(name,space(level)) concat(name, repeat(' ',level))
string string
drop table t1;
DROP DATABASE d1; DROP DATABASE d1;
USE test; USE test;
SET character_set_server= @safe_character_set_server; SET character_set_server= @safe_character_set_server;
SET collation_server= @safe_collation_server; SET collation_server= @safe_collation_server;
SET character_set_client= @safe_character_set_client;
SET character_set_results= @safe_character_set_results;
SET NAMES big5; SET NAMES big5;
SET collation_connection='big5_chinese_ci'; SET collation_connection='big5_chinese_ci';
create table t1 select repeat('a',4000) a; create table t1 select repeat('a',4000) a;
......
...@@ -2,6 +2,192 @@ DROP TABLE IF EXISTS t1; ...@@ -2,6 +2,192 @@ DROP TABLE IF EXISTS t1;
SHOW COLLATION LIKE 'cp1250_czech_cs'; SHOW COLLATION LIKE 'cp1250_czech_cs';
Collation Charset Id Default Compiled Sortlen Collation Charset Id Default Compiled Sortlen
cp1250_czech_cs cp1250 34 Yes 2 cp1250_czech_cs cp1250 34 Yes 2
SET @test_character_set= 'cp1250';
SET @test_collation= 'cp1250_general_ci';
SET @safe_character_set_server= @@character_set_server;
SET @safe_collation_server= @@collation_server;
SET @safe_character_set_client= @@character_set_client;
SET @safe_character_set_results= @@character_set_results;
SET character_set_server= @test_character_set;
SET collation_server= @test_collation;
CREATE DATABASE d1;
USE d1;
CREATE TABLE t1 (c CHAR(10), KEY(c));
SHOW FULL COLUMNS FROM t1;
Field Type Collation Null Key Default Extra Privileges Comment
c char(10) cp1250_general_ci YES MUL NULL
INSERT INTO t1 VALUES ('aaa'),('aaaa'),('aaaaa');
SELECT c as want3results FROM t1 WHERE c LIKE 'aaa%';
want3results
aaa
aaaa
aaaaa
DROP TABLE t1;
CREATE TABLE t1 (c1 varchar(15), KEY c1 (c1(2)));
SHOW FULL COLUMNS FROM t1;
Field Type Collation Null Key Default Extra Privileges Comment
c1 varchar(15) cp1250_general_ci YES MUL NULL
INSERT INTO t1 VALUES ('location'),('loberge'),('lotre'),('boabab');
SELECT c1 as want3results from t1 where c1 like 'l%';
want3results
location
loberge
lotre
SELECT c1 as want3results from t1 where c1 like 'lo%';
want3results
location
loberge
lotre
SELECT c1 as want1result from t1 where c1 like 'loc%';
want1result
location
SELECT c1 as want1result from t1 where c1 like 'loca%';
want1result
location
SELECT c1 as want1result from t1 where c1 like 'locat%';
want1result
location
SELECT c1 as want1result from t1 where c1 like 'locati%';
want1result
location
SELECT c1 as want1result from t1 where c1 like 'locatio%';
want1result
location
SELECT c1 as want1result from t1 where c1 like 'location%';
want1result
location
DROP TABLE t1;
create table t1 (a set('a') not null);
insert into t1 values (),();
Warnings:
Warning 1364 Field 'a' doesn't have a default value
select cast(a as char(1)) from t1;
cast(a as char(1))
select a sounds like a from t1;
a sounds like a
1
1
select 1 from t1 order by cast(a as char(1));
1
1
1
drop table t1;
set names utf8;
create table t1 (
name varchar(10),
level smallint unsigned);
show create table t1;
Table Create Table
t1 CREATE TABLE `t1` (
`name` varchar(10) default NULL,
`level` smallint(5) unsigned default NULL
) ENGINE=MyISAM DEFAULT CHARSET=cp1250
insert into t1 values ('string',1);
select concat(name,space(level)), concat(name, repeat(' ',level)) from t1;
concat(name,space(level)) concat(name, repeat(' ',level))
string string
drop table t1;
DROP DATABASE d1;
USE test;
SET character_set_server= @safe_character_set_server;
SET collation_server= @safe_collation_server;
SET character_set_client= @safe_character_set_client;
SET character_set_results= @safe_character_set_results;
SET @test_character_set= 'cp1250';
SET @test_collation= 'cp1250_czech_cs';
SET @safe_character_set_server= @@character_set_server;
SET @safe_collation_server= @@collation_server;
SET @safe_character_set_client= @@character_set_client;
SET @safe_character_set_results= @@character_set_results;
SET character_set_server= @test_character_set;
SET collation_server= @test_collation;
CREATE DATABASE d1;
USE d1;
CREATE TABLE t1 (c CHAR(10), KEY(c));
SHOW FULL COLUMNS FROM t1;
Field Type Collation Null Key Default Extra Privileges Comment
c char(10) cp1250_czech_cs YES MUL NULL
INSERT INTO t1 VALUES ('aaa'),('aaaa'),('aaaaa');
SELECT c as want3results FROM t1 WHERE c LIKE 'aaa%';
want3results
aaa
aaaa
aaaaa
DROP TABLE t1;
CREATE TABLE t1 (c1 varchar(15), KEY c1 (c1(2)));
SHOW FULL COLUMNS FROM t1;
Field Type Collation Null Key Default Extra Privileges Comment
c1 varchar(15) cp1250_czech_cs YES MUL NULL
INSERT INTO t1 VALUES ('location'),('loberge'),('lotre'),('boabab');
SELECT c1 as want3results from t1 where c1 like 'l%';
want3results
location
loberge
lotre
SELECT c1 as want3results from t1 where c1 like 'lo%';
want3results
location
loberge
lotre
SELECT c1 as want1result from t1 where c1 like 'loc%';
want1result
location
SELECT c1 as want1result from t1 where c1 like 'loca%';
want1result
location
SELECT c1 as want1result from t1 where c1 like 'locat%';
want1result
location
SELECT c1 as want1result from t1 where c1 like 'locati%';
want1result
location
SELECT c1 as want1result from t1 where c1 like 'locatio%';
want1result
location
SELECT c1 as want1result from t1 where c1 like 'location%';
want1result
location
DROP TABLE t1;
create table t1 (a set('a') not null);
insert into t1 values (),();
Warnings:
Warning 1364 Field 'a' doesn't have a default value
select cast(a as char(1)) from t1;
cast(a as char(1))
select a sounds like a from t1;
a sounds like a
1
1
select 1 from t1 order by cast(a as char(1));
1
1
1
drop table t1;
set names utf8;
create table t1 (
name varchar(10),
level smallint unsigned);
show create table t1;
Table Create Table
t1 CREATE TABLE `t1` (
`name` varchar(10) collate cp1250_czech_cs default NULL,
`level` smallint(5) unsigned default NULL
) ENGINE=MyISAM DEFAULT CHARSET=cp1250 COLLATE=cp1250_czech_cs
insert into t1 values ('string',1);
select concat(name,space(level)), concat(name, repeat(' ',level)) from t1;
concat(name,space(level)) concat(name, repeat(' ',level))
string string
drop table t1;
DROP DATABASE d1;
USE test;
SET character_set_server= @safe_character_set_server;
SET collation_server= @safe_collation_server;
SET character_set_client= @safe_character_set_client;
SET character_set_results= @safe_character_set_results;
CREATE TABLE t1 (a char(16)) character set cp1250 collate cp1250_czech_cs; CREATE TABLE t1 (a char(16)) character set cp1250 collate cp1250_czech_cs;
INSERT INTO t1 VALUES (''); INSERT INTO t1 VALUES ('');
SELECT a, length(a), a='', a=' ', a=' ' FROM t1; SELECT a, length(a), a='', a=' ', a=' ' FROM t1;
......
...@@ -6,6 +6,8 @@ SET @test_character_set= 'cp932'; ...@@ -6,6 +6,8 @@ SET @test_character_set= 'cp932';
SET @test_collation= 'cp932_japanese_ci'; SET @test_collation= 'cp932_japanese_ci';
SET @safe_character_set_server= @@character_set_server; SET @safe_character_set_server= @@character_set_server;
SET @safe_collation_server= @@collation_server; SET @safe_collation_server= @@collation_server;
SET @safe_character_set_client= @@character_set_client;
SET @safe_character_set_results= @@character_set_results;
SET character_set_server= @test_character_set; SET character_set_server= @test_character_set;
SET collation_server= @test_collation; SET collation_server= @test_collation;
CREATE DATABASE d1; CREATE DATABASE d1;
...@@ -72,10 +74,27 @@ select 1 from t1 order by cast(a as char(1)); ...@@ -72,10 +74,27 @@ select 1 from t1 order by cast(a as char(1));
1 1
1 1
drop table t1; drop table t1;
set names utf8;
create table t1 (
name varchar(10),
level smallint unsigned);
show create table t1;
Table Create Table
t1 CREATE TABLE `t1` (
`name` varchar(10) default NULL,
`level` smallint(5) unsigned default NULL
) ENGINE=MyISAM DEFAULT CHARSET=cp932
insert into t1 values ('string',1);
select concat(name,space(level)), concat(name, repeat(' ',level)) from t1;
concat(name,space(level)) concat(name, repeat(' ',level))
string string
drop table t1;
DROP DATABASE d1; DROP DATABASE d1;
USE test; USE test;
SET character_set_server= @safe_character_set_server; SET character_set_server= @safe_character_set_server;
SET collation_server= @safe_collation_server; SET collation_server= @safe_collation_server;
SET character_set_client= @safe_character_set_client;
SET character_set_results= @safe_character_set_results;
set names cp932; set names cp932;
set character_set_database = cp932; set character_set_database = cp932;
CREATE TABLE t1(c1 CHAR(1)) DEFAULT CHARACTER SET = cp932; CREATE TABLE t1(c1 CHAR(1)) DEFAULT CHARACTER SET = cp932;
......
...@@ -3,6 +3,8 @@ SET @test_character_set= 'euckr'; ...@@ -3,6 +3,8 @@ SET @test_character_set= 'euckr';
SET @test_collation= 'euckr_korean_ci'; SET @test_collation= 'euckr_korean_ci';
SET @safe_character_set_server= @@character_set_server; SET @safe_character_set_server= @@character_set_server;
SET @safe_collation_server= @@collation_server; SET @safe_collation_server= @@collation_server;
SET @safe_character_set_client= @@character_set_client;
SET @safe_character_set_results= @@character_set_results;
SET character_set_server= @test_character_set; SET character_set_server= @test_character_set;
SET collation_server= @test_collation; SET collation_server= @test_collation;
CREATE DATABASE d1; CREATE DATABASE d1;
...@@ -69,10 +71,27 @@ select 1 from t1 order by cast(a as char(1)); ...@@ -69,10 +71,27 @@ select 1 from t1 order by cast(a as char(1));
1 1
1 1
drop table t1; drop table t1;
set names utf8;
create table t1 (
name varchar(10),
level smallint unsigned);
show create table t1;
Table Create Table
t1 CREATE TABLE `t1` (
`name` varchar(10) default NULL,
`level` smallint(5) unsigned default NULL
) ENGINE=MyISAM DEFAULT CHARSET=euckr
insert into t1 values ('string',1);
select concat(name,space(level)), concat(name, repeat(' ',level)) from t1;
concat(name,space(level)) concat(name, repeat(' ',level))
string string
drop table t1;
DROP DATABASE d1; DROP DATABASE d1;
USE test; USE test;
SET character_set_server= @safe_character_set_server; SET character_set_server= @safe_character_set_server;
SET collation_server= @safe_collation_server; SET collation_server= @safe_collation_server;
SET character_set_client= @safe_character_set_client;
SET character_set_results= @safe_character_set_results;
SET NAMES euckr; SET NAMES euckr;
SET collation_connection='euckr_korean_ci'; SET collation_connection='euckr_korean_ci';
create table t1 select repeat('a',4000) a; create table t1 select repeat('a',4000) a;
......
...@@ -3,6 +3,8 @@ SET @test_character_set= 'gb2312'; ...@@ -3,6 +3,8 @@ SET @test_character_set= 'gb2312';
SET @test_collation= 'gb2312_chinese_ci'; SET @test_collation= 'gb2312_chinese_ci';
SET @safe_character_set_server= @@character_set_server; SET @safe_character_set_server= @@character_set_server;
SET @safe_collation_server= @@collation_server; SET @safe_collation_server= @@collation_server;
SET @safe_character_set_client= @@character_set_client;
SET @safe_character_set_results= @@character_set_results;
SET character_set_server= @test_character_set; SET character_set_server= @test_character_set;
SET collation_server= @test_collation; SET collation_server= @test_collation;
CREATE DATABASE d1; CREATE DATABASE d1;
...@@ -69,10 +71,27 @@ select 1 from t1 order by cast(a as char(1)); ...@@ -69,10 +71,27 @@ select 1 from t1 order by cast(a as char(1));
1 1
1 1
drop table t1; drop table t1;
set names utf8;
create table t1 (
name varchar(10),
level smallint unsigned);
show create table t1;
Table Create Table
t1 CREATE TABLE `t1` (
`name` varchar(10) default NULL,
`level` smallint(5) unsigned default NULL
) ENGINE=MyISAM DEFAULT CHARSET=gb2312
insert into t1 values ('string',1);
select concat(name,space(level)), concat(name, repeat(' ',level)) from t1;
concat(name,space(level)) concat(name, repeat(' ',level))
string string
drop table t1;
DROP DATABASE d1; DROP DATABASE d1;
USE test; USE test;
SET character_set_server= @safe_character_set_server; SET character_set_server= @safe_character_set_server;
SET collation_server= @safe_collation_server; SET collation_server= @safe_collation_server;
SET character_set_client= @safe_character_set_client;
SET character_set_results= @safe_character_set_results;
SET NAMES gb2312; SET NAMES gb2312;
SET collation_connection='gb2312_chinese_ci'; SET collation_connection='gb2312_chinese_ci';
create table t1 select repeat('a',4000) a; create table t1 select repeat('a',4000) a;
......
...@@ -3,6 +3,8 @@ SET @test_character_set= 'gbk'; ...@@ -3,6 +3,8 @@ SET @test_character_set= 'gbk';
SET @test_collation= 'gbk_chinese_ci'; SET @test_collation= 'gbk_chinese_ci';
SET @safe_character_set_server= @@character_set_server; SET @safe_character_set_server= @@character_set_server;
SET @safe_collation_server= @@collation_server; SET @safe_collation_server= @@collation_server;
SET @safe_character_set_client= @@character_set_client;
SET @safe_character_set_results= @@character_set_results;
SET character_set_server= @test_character_set; SET character_set_server= @test_character_set;
SET collation_server= @test_collation; SET collation_server= @test_collation;
CREATE DATABASE d1; CREATE DATABASE d1;
...@@ -69,10 +71,27 @@ select 1 from t1 order by cast(a as char(1)); ...@@ -69,10 +71,27 @@ select 1 from t1 order by cast(a as char(1));
1 1
1 1
drop table t1; drop table t1;
set names utf8;
create table t1 (
name varchar(10),
level smallint unsigned);
show create table t1;
Table Create Table
t1 CREATE TABLE `t1` (
`name` varchar(10) default NULL,
`level` smallint(5) unsigned default NULL
) ENGINE=MyISAM DEFAULT CHARSET=gbk
insert into t1 values ('string',1);
select concat(name,space(level)), concat(name, repeat(' ',level)) from t1;
concat(name,space(level)) concat(name, repeat(' ',level))
string string
drop table t1;
DROP DATABASE d1; DROP DATABASE d1;
USE test; USE test;
SET character_set_server= @safe_character_set_server; SET character_set_server= @safe_character_set_server;
SET collation_server= @safe_collation_server; SET collation_server= @safe_collation_server;
SET character_set_client= @safe_character_set_client;
SET character_set_results= @safe_character_set_results;
SET NAMES gbk; SET NAMES gbk;
SET collation_connection='gbk_chinese_ci'; SET collation_connection='gbk_chinese_ci';
create table t1 select repeat('a',4000) a; create table t1 select repeat('a',4000) a;
......
...@@ -2538,6 +2538,8 @@ SET @test_character_set= 'utf8'; ...@@ -2538,6 +2538,8 @@ SET @test_character_set= 'utf8';
SET @test_collation= 'utf8_swedish_ci'; SET @test_collation= 'utf8_swedish_ci';
SET @safe_character_set_server= @@character_set_server; SET @safe_character_set_server= @@character_set_server;
SET @safe_collation_server= @@collation_server; SET @safe_collation_server= @@collation_server;
SET @safe_character_set_client= @@character_set_client;
SET @safe_character_set_results= @@character_set_results;
SET character_set_server= @test_character_set; SET character_set_server= @test_character_set;
SET collation_server= @test_collation; SET collation_server= @test_collation;
CREATE DATABASE d1; CREATE DATABASE d1;
...@@ -2604,10 +2606,27 @@ select 1 from t1 order by cast(a as char(1)); ...@@ -2604,10 +2606,27 @@ select 1 from t1 order by cast(a as char(1));
1 1
1 1
drop table t1; drop table t1;
set names utf8;
create table t1 (
name varchar(10),
level smallint unsigned);
show create table t1;
Table Create Table
t1 CREATE TABLE `t1` (
`name` varchar(10) collate utf8_swedish_ci default NULL,
`level` smallint(5) unsigned default NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_swedish_ci
insert into t1 values ('string',1);
select concat(name,space(level)), concat(name, repeat(' ',level)) from t1;
concat(name,space(level)) concat(name, repeat(' ',level))
string string
drop table t1;
DROP DATABASE d1; DROP DATABASE d1;
USE test; USE test;
SET character_set_server= @safe_character_set_server; SET character_set_server= @safe_character_set_server;
SET collation_server= @safe_collation_server; SET collation_server= @safe_collation_server;
SET character_set_client= @safe_character_set_client;
SET character_set_results= @safe_character_set_results;
create table t1 (a varchar(1)) character set utf8 collate utf8_estonian_ci; create table t1 (a varchar(1)) character set utf8 collate utf8_estonian_ci;
insert into t1 values ('A'),('B'),('C'),('a'),('b'),('c'); insert into t1 values ('A'),('B'),('C'),('a'),('b'),('c');
select a, a regexp '[a]' from t1 order by binary a; select a, a regexp '[a]' from t1 order by binary a;
......
DROP TABLE IF EXISTS t1; DROP TABLE IF EXISTS t1;
SET @test_character_set= 'ucs2';
SET @test_collation= 'ucs2_general_ci';
SET @safe_character_set_server= @@character_set_server;
SET @safe_collation_server= @@collation_server;
SET @safe_character_set_client= @@character_set_client;
SET @safe_character_set_results= @@character_set_results;
SET character_set_server= @test_character_set;
SET collation_server= @test_collation;
CREATE DATABASE d1;
USE d1;
CREATE TABLE t1 (c CHAR(10), KEY(c));
SHOW FULL COLUMNS FROM t1;
Field Type Collation Null Key Default Extra Privileges Comment
c char(10) ucs2_general_ci YES MUL NULL
INSERT INTO t1 VALUES ('aaa'),('aaaa'),('aaaaa');
SELECT c as want3results FROM t1 WHERE c LIKE 'aaa%';
want3results
aaa
aaaa
aaaaa
DROP TABLE t1;
CREATE TABLE t1 (c1 varchar(15), KEY c1 (c1(2)));
SHOW FULL COLUMNS FROM t1;
Field Type Collation Null Key Default Extra Privileges Comment
c1 varchar(15) ucs2_general_ci YES MUL NULL
INSERT INTO t1 VALUES ('location'),('loberge'),('lotre'),('boabab');
SELECT c1 as want3results from t1 where c1 like 'l%';
want3results
location
loberge
lotre
SELECT c1 as want3results from t1 where c1 like 'lo%';
want3results
location
loberge
lotre
SELECT c1 as want1result from t1 where c1 like 'loc%';
want1result
location
SELECT c1 as want1result from t1 where c1 like 'loca%';
want1result
location
SELECT c1 as want1result from t1 where c1 like 'locat%';
want1result
location
SELECT c1 as want1result from t1 where c1 like 'locati%';
want1result
location
SELECT c1 as want1result from t1 where c1 like 'locatio%';
want1result
location
SELECT c1 as want1result from t1 where c1 like 'location%';
want1result
location
DROP TABLE t1;
create table t1 (a set('a') not null);
insert into t1 values (),();
Warnings:
Warning 1364 Field 'a' doesn't have a default value
select cast(a as char(1)) from t1;
cast(a as char(1))
select a sounds like a from t1;
a sounds like a
1
1
select 1 from t1 order by cast(a as char(1));
1
1
1
drop table t1;
set names utf8;
create table t1 (
name varchar(10),
level smallint unsigned);
show create table t1;
Table Create Table
t1 CREATE TABLE `t1` (
`name` varchar(10) default NULL,
`level` smallint(5) unsigned default NULL
) ENGINE=MyISAM DEFAULT CHARSET=ucs2
insert into t1 values ('string',1);
select concat(name,space(level)), concat(name, repeat(' ',level)) from t1;
concat(name,space(level)) concat(name, repeat(' ',level))
string string
drop table t1;
DROP DATABASE d1;
USE test;
SET character_set_server= @safe_character_set_server;
SET collation_server= @safe_collation_server;
SET character_set_client= @safe_character_set_client;
SET character_set_results= @safe_character_set_results;
SET NAMES latin1; SET NAMES latin1;
SET character_set_connection=ucs2; SET character_set_connection=ucs2;
select 'a' = 'a', 'a' = 'a ', 'a ' = 'a'; select 'a' = 'a', 'a' = 'a ', 'a ' = 'a';
......
...@@ -21,4 +21,14 @@ INSERT INTO t1 VALUES('A', 'A'), ('B', 'B'), ('C', 'C'); ...@@ -21,4 +21,14 @@ INSERT INTO t1 VALUES('A', 'A'), ('B', 'B'), ('C', 'C');
INSERT INTO t1 VALUES('A ', 'A '); INSERT INTO t1 VALUES('A ', 'A ');
ERROR 23000: Duplicate entry '' for key 1 ERROR 23000: Duplicate entry '' for key 1
DROP TABLE t1; DROP TABLE t1;
CREATE TABLE t1 (
c1 CHAR(255) CHARACTER SET UCS2 COLLATE UCS2_BIN NOT NULL,
KEY(c1)
) ENGINE=MyISAM;
INSERT INTO t1 VALUES ('marshall\'s');
INSERT INTO t1 VALUES ('marsh');
CHECK TABLE t1 EXTENDED;
Table Op Msg_type Msg_text
test.t1 check status OK
DROP TABLE t1;
End of 5.0 tests End of 5.0 tests
...@@ -2045,6 +2045,32 @@ select 1 from t1 order by a; ...@@ -2045,6 +2045,32 @@ select 1 from t1 order by a;
drop table t1; drop table t1;
drop table t1; drop table t1;
drop view v1; drop view v1;
CREATE TABLE t1 (a INT, b INT, KEY(a,b));
INSERT INTO t1 VALUES(NULL,1),(1,NULL),(NULL,NULL),(1,1),(2,2);
CREATE TABLE t1 (a INT, b INT, KEY(a,b)) ENGINE=federated
CONNECTION='mysql://root@127.0.0.1:SLAVE_PORT/test/t1';
SELECT * FROM t1 WHERE a IS NULL;
a b
NULL NULL
NULL 1
SELECT * FROM t1 WHERE a IS NOT NULL;
a b
1 NULL
1 1
2 2
SELECT * FROM t1 WHERE a=1 AND b=1;
a b
1 1
SELECT * FROM t1 WHERE a IS NULL AND b=1;
a b
NULL 1
SELECT * FROM t1 WHERE a IS NOT NULL AND b=1;
a b
1 1
DROP TABLE t1;
DROP TABLE t1;
CREATE TABLE t1 (a INT) ENGINE=federated CONNECTION='mysql://@:://';
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;
......
...@@ -244,4 +244,7 @@ select min(a) from t1 group by inet_ntoa(a); ...@@ -244,4 +244,7 @@ select min(a) from t1 group by inet_ntoa(a);
min(a) min(a)
-2 -2
drop table t1; drop table t1;
SELECT NAME_CONST('var', 'value') COLLATE latin1_general_cs;
NAME_CONST('var', 'value') COLLATE latin1_general_cs
value
End of 5.0 tests End of 5.0 tests
...@@ -918,4 +918,26 @@ id ref ...@@ -918,4 +918,26 @@ id ref
3 2 3 2
4 5 4 5
DROP TABLE t1, t2, t3; DROP TABLE t1, t2, t3;
CREATE TABLE t1(a INT);
CREATE TABLE m1(a INT) ENGINE=MERGE;
SHOW CREATE TABLE m1;
Table Create Table
m1 CREATE TABLE `m1` (
`a` int(11) default NULL
) ENGINE=MRG_MyISAM DEFAULT CHARSET=latin1
DROP TABLE m1;
CREATE TABLE m1(a INT) ENGINE=MERGE UNION=();
SHOW CREATE TABLE m1;
Table Create Table
m1 CREATE TABLE `m1` (
`a` int(11) default NULL
) ENGINE=MRG_MyISAM DEFAULT CHARSET=latin1
ALTER TABLE m1 UNION=(t1);
ALTER TABLE m1 UNION=();
SHOW CREATE TABLE m1;
Table Create Table
m1 CREATE TABLE `m1` (
`a` int(11) default NULL
) ENGINE=MRG_MyISAM DEFAULT CHARSET=latin1
DROP TABLE t1, m1;
End of 5.0 tests End of 5.0 tests
...@@ -1654,3 +1654,30 @@ set GLOBAL query_cache_type=default; ...@@ -1654,3 +1654,30 @@ set GLOBAL query_cache_type=default;
set GLOBAL query_cache_limit=default; set GLOBAL query_cache_limit=default;
set GLOBAL query_cache_min_res_unit=default; set GLOBAL query_cache_min_res_unit=default;
set GLOBAL query_cache_size=default; set GLOBAL query_cache_size=default;
use test;
FLUSH STATUS;
SET GLOBAL query_cache_size=10*1024*1024;
SET @save_concurrent_insert= @@concurrent_insert;
SET GLOBAL concurrent_insert= 0;
CREATE TABLE t1 (c1 INT NOT NULL) ENGINE=MyISAM;
INSERT INTO t1 (c1) VALUES (1), (2);
SHOW GLOBAL VARIABLES LIKE 'concurrent_insert';
Variable_name Value
concurrent_insert 0
SHOW STATUS LIKE 'Qcache_hits';
Variable_name Value
Qcache_hits 0
SELECT * FROM t1;
c1
1
2
SELECT * FROM t1;
c1
1
2
SHOW STATUS LIKE 'Qcache_hits';
Variable_name Value
Qcache_hits 1
DROP TABLE t1;
SET GLOBAL concurrent_insert= @save_concurrent_insert;
SET GLOBAL query_cache_size= default;
...@@ -8,15 +8,53 @@ reset master; ...@@ -8,15 +8,53 @@ reset master;
change master to master_host="127.0.0.1",master_port=SLAVE_PORT,master_user="root"; change master to master_host="127.0.0.1",master_port=SLAVE_PORT,master_user="root";
start slave; start slave;
create table t1 (n int); create table t1 (n int);
stop slave;
create table t2 (n int);
show tables;
Tables_in_test
t1
t2
create table t3 (n int) engine=innodb;
set @a=1;
insert into t3 values(@a);
begin;
insert into t3 values(2);
insert into t3 values(3);
commit;
insert into t3 values(4);
start slave until master_log_file="slave-bin.000001",master_log_pos=195;
Warnings:
Note 1278 It is recommended to use --skip-slave-start when doing step-by-step replication with START SLAVE UNTIL; otherwise, you will get problems if you get an unexpected slave's mysqld restart
show tables;
Tables_in_test
t1
t2
start slave until master_log_file="slave-bin.000001",master_log_pos=438;
Warnings:
Note 1278 It is recommended to use --skip-slave-start when doing step-by-step replication with START SLAVE UNTIL; otherwise, you will get problems if you get an unexpected slave's mysqld restart
select * from t3;
n
1
start slave until master_log_file="slave-bin.000001",master_log_pos=663;
Warnings:
Note 1278 It is recommended to use --skip-slave-start when doing step-by-step replication with START SLAVE UNTIL; otherwise, you will get problems if you get an unexpected slave's mysqld restart
select * from t3;
n
1
2
3
start slave;
create table t4 (n int); create table t4 (n int);
create table t5 (n int); create table t5 (n int);
create table t6 (n int); create table t6 (n int);
show tables; show tables;
Tables_in_test Tables_in_test
t1 t1
t2
t3
t4 t4
t5 t5
t6 t6
stop slave; stop slave;
reset slave; reset slave;
drop table t1,t4,t5,t6; drop table t1,t2,t3,t4,t5,t6;
...@@ -93,3 +93,4 @@ c ...@@ -93,3 +93,4 @@ c
1,2,3 1,2,3
64 64
DROP TABLE t1; DROP TABLE t1;
End of 5.0 tests
...@@ -6,6 +6,16 @@ DROP TABLE IF EXISTS t1; ...@@ -6,6 +6,16 @@ DROP TABLE IF EXISTS t1;
SHOW COLLATION LIKE 'cp1250_czech_cs'; SHOW COLLATION LIKE 'cp1250_czech_cs';
SET @test_character_set= 'cp1250';
SET @test_collation= 'cp1250_general_ci';
-- source include/ctype_common.inc
SET @test_character_set= 'cp1250';
SET @test_collation= 'cp1250_czech_cs';
-- source include/ctype_common.inc
# #
# Bugs: #8840: Empty string comparison and character set 'cp1250' # Bugs: #8840: Empty string comparison and character set 'cp1250'
# #
......
...@@ -4,6 +4,10 @@ ...@@ -4,6 +4,10 @@
DROP TABLE IF EXISTS t1; DROP TABLE IF EXISTS t1;
--enable_warnings --enable_warnings
SET @test_character_set= 'ucs2';
SET @test_collation= 'ucs2_general_ci';
-- source include/ctype_common.inc
SET NAMES latin1; SET NAMES latin1;
SET character_set_connection=ucs2; SET character_set_connection=ucs2;
-- source include/endspace.inc -- source include/endspace.inc
......
...@@ -39,4 +39,17 @@ INSERT INTO t1 VALUES('A', 'A'), ('B', 'B'), ('C', 'C'); ...@@ -39,4 +39,17 @@ INSERT INTO t1 VALUES('A', 'A'), ('B', 'B'), ('C', 'C');
INSERT INTO t1 VALUES('A ', 'A '); INSERT INTO t1 VALUES('A ', 'A ');
DROP TABLE t1; DROP TABLE t1;
#
# Bug#32705 - myisam corruption: Key in wrong position
# at page 1024 with ucs2_bin
#
CREATE TABLE t1 (
c1 CHAR(255) CHARACTER SET UCS2 COLLATE UCS2_BIN NOT NULL,
KEY(c1)
) ENGINE=MyISAM;
INSERT INTO t1 VALUES ('marshall\'s');
INSERT INTO t1 VALUES ('marsh');
CHECK TABLE t1 EXTENDED;
DROP TABLE t1;
--echo End of 5.0 tests --echo End of 5.0 tests
...@@ -1716,5 +1716,38 @@ connection slave; ...@@ -1716,5 +1716,38 @@ connection slave;
drop table t1; drop table t1;
drop view v1; drop view v1;
#
# BUG#33946 - Join on Federated tables with Unique index gives error 1430
# from storage engine
#
connection slave;
CREATE TABLE t1 (a INT, b INT, KEY(a,b));
INSERT INTO t1 VALUES(NULL,1),(1,NULL),(NULL,NULL),(1,1),(2,2);
connection master;
--replace_result $SLAVE_MYPORT SLAVE_PORT
eval CREATE TABLE t1 (a INT, b INT, KEY(a,b)) ENGINE=federated
CONNECTION='mysql://root@127.0.0.1:$SLAVE_MYPORT/test/t1';
SELECT * FROM t1 WHERE a IS NULL;
SELECT * FROM t1 WHERE a IS NOT NULL;
SELECT * FROM t1 WHERE a=1 AND b=1;
SELECT * FROM t1 WHERE a IS NULL AND b=1;
SELECT * FROM t1 WHERE a IS NOT NULL AND b=1;
DROP TABLE t1;
connection slave;
DROP TABLE t1;
#
# BUG#34788 - malformed federated connection url is not handled correctly -
# crashes server !
#
# also tests
#
# BUG#35509 - Federated leaks memory when connecting to localhost/default
# port
#
CREATE TABLE t1 (a INT) ENGINE=federated CONNECTION='mysql://@:://';
DROP TABLE t1;
source include/federated_cleanup.inc; source include/federated_cleanup.inc;
...@@ -255,5 +255,11 @@ insert into t1 values (-1), (-2); ...@@ -255,5 +255,11 @@ insert into t1 values (-1), (-2);
select min(a) from t1 group by inet_ntoa(a); select min(a) from t1 group by inet_ntoa(a);
drop table t1; drop table t1;
#
# BUG#34289 - Incorrect NAME_CONST substitution in stored procedures breaks
# replication
#
SELECT NAME_CONST('var', 'value') COLLATE latin1_general_cs;
--echo End of 5.0 tests --echo End of 5.0 tests
...@@ -542,5 +542,18 @@ SELECT * FROM t3; ...@@ -542,5 +542,18 @@ SELECT * FROM t3;
DROP TABLE t1, t2, t3; DROP TABLE t1, t2, t3;
#
# BUG#28248 - mysqldump results with MERGE ... UNION=() cannot be executed
#
CREATE TABLE t1(a INT);
CREATE TABLE m1(a INT) ENGINE=MERGE;
SHOW CREATE TABLE m1;
DROP TABLE m1;
CREATE TABLE m1(a INT) ENGINE=MERGE UNION=();
SHOW CREATE TABLE m1;
ALTER TABLE m1 UNION=(t1);
ALTER TABLE m1 UNION=();
SHOW CREATE TABLE m1;
DROP TABLE t1, m1;
--echo End of 5.0 tests --echo End of 5.0 tests
...@@ -1255,5 +1255,25 @@ set GLOBAL query_cache_type=default; ...@@ -1255,5 +1255,25 @@ set GLOBAL query_cache_type=default;
set GLOBAL query_cache_limit=default; set GLOBAL query_cache_limit=default;
set GLOBAL query_cache_min_res_unit=default; set GLOBAL query_cache_min_res_unit=default;
set GLOBAL query_cache_size=default; set GLOBAL query_cache_size=default;
use test;
#
# Bug#33756 - query cache with concurrent_insert=0 appears broken
#
FLUSH STATUS;
SET GLOBAL query_cache_size=10*1024*1024;
SET @save_concurrent_insert= @@concurrent_insert;
SET GLOBAL concurrent_insert= 0;
CREATE TABLE t1 (c1 INT NOT NULL) ENGINE=MyISAM;
INSERT INTO t1 (c1) VALUES (1), (2);
#
SHOW GLOBAL VARIABLES LIKE 'concurrent_insert';
SHOW STATUS LIKE 'Qcache_hits';
SELECT * FROM t1;
SELECT * FROM t1;
SHOW STATUS LIKE 'Qcache_hits';
DROP TABLE t1;
SET GLOBAL concurrent_insert= @save_concurrent_insert;
SET GLOBAL query_cache_size= default;
# End of 5.0 tests # End of 5.0 tests
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
# It also will test BUG#13861. # It also will test BUG#13861.
source include/master-slave.inc; source include/master-slave.inc;
source include/have_innodb.inc;
# set up "dual head" # set up "dual head"
...@@ -30,45 +31,58 @@ save_master_pos; ...@@ -30,45 +31,58 @@ save_master_pos;
connection master; connection master;
sync_with_master; sync_with_master;
# Now test BUG#13861. This will be enabled when Guilhem fixes this #
# bug. # BUG#13861 - START SLAVE UNTIL may stop 1 evnt too late if
# log-slave-updates and circul repl
#
stop slave;
# stop slave create table t2 (n int); # create one ignored event
# create table t2 (n int); # create one ignored event save_master_pos;
connection slave;
sync_with_master;
# save_master_pos; connection slave;
# connection slave;
# sync_with_master;
# connection slave; show tables;
# show tables; save_master_pos;
# save_master_pos; create table t3 (n int) engine=innodb;
set @a=1;
insert into t3 values(@a);
begin;
insert into t3 values(2);
insert into t3 values(3);
commit;
insert into t3 values(4);
# create table t3 (n int);
# connection master; connection master;
# bug is that START SLAVE UNTIL may stop too late, we test that by # bug is that START SLAVE UNTIL may stop too late, we test that by
# asking it to stop before creation of t3. # asking it to stop before creation of t3.
# start slave until master_log_file="slave-bin.000001",master_log_pos=195; start slave until master_log_file="slave-bin.000001",master_log_pos=195;
wait_for_slave_to_stop;
# wait until it's started (the position below is the start of "CREATE
# TABLE t2") (otherwise wait_for_slave_to_stop may return at once)
# select master_pos_wait("slave-bin.000001",137);
# wait_for_slave_to_stop;
# then BUG#13861 causes t3 to show up below (because stopped too # then BUG#13861 causes t3 to show up below (because stopped too
# late). # late).
# show tables; show tables;
# start slave; # ensure that we do not break set @a=1; insert into t3 values(@a);
start slave until master_log_file="slave-bin.000001",master_log_pos=438;
wait_for_slave_to_stop;
select * from t3;
# ensure that we do not break transaction
start slave until master_log_file="slave-bin.000001",master_log_pos=663;
wait_for_slave_to_stop;
select * from t3;
start slave;
# BUG#13023 is that Exec_master_log_pos may stay too low "forever": # BUG#13023 is that Exec_master_log_pos may stay too low "forever":
...@@ -99,7 +113,7 @@ show tables; ...@@ -99,7 +113,7 @@ show tables;
stop slave; stop slave;
reset slave; reset slave;
drop table t1,t4,t5,t6; # add t2 and t3 later drop table t1,t2,t3,t4,t5,t6;
save_master_pos; save_master_pos;
connection slave; connection slave;
......
...@@ -39,7 +39,7 @@ COMMIT; ...@@ -39,7 +39,7 @@ COMMIT;
BEGIN; BEGIN;
INSERT INTO tmyisam VALUES (5); INSERT INTO tmyisam VALUES (5);
INSERT INTO tmyisam VALUES (6); INSERT INTO tmyisam VALUES (6);
--warning 1196 #--warning 1196
ROLLBACK; ROLLBACK;
SELECT * FROM tmyisam ORDER BY a; SELECT * FROM tmyisam ORDER BY a;
......
...@@ -75,4 +75,4 @@ INSERT INTO t1 VALUES(9223372036854775808); ...@@ -75,4 +75,4 @@ INSERT INTO t1 VALUES(9223372036854775808);
SELECT * FROM t1; SELECT * FROM t1;
DROP TABLE t1; DROP TABLE t1;
--# echo End of 5.0 tests --echo End of 5.0 tests
...@@ -643,13 +643,20 @@ static int parse_url(FEDERATED_SHARE *share, TABLE *table, ...@@ -643,13 +643,20 @@ static int parse_url(FEDERATED_SHARE *share, TABLE *table,
if ((strchr(share->table_name, '/'))) if ((strchr(share->table_name, '/')))
goto error; goto error;
/*
If hostname is omitted, we set it to NULL. According to
mysql_real_connect() manual:
The value of host may be either a hostname or an IP address.
If host is NULL or the string "localhost", a connection to the
local host is assumed.
*/
if (share->hostname[0] == '\0') if (share->hostname[0] == '\0')
share->hostname= NULL; share->hostname= NULL;
if (!share->port) if (!share->port)
{ {
if (strcmp(share->hostname, my_localhost) == 0) if (!share->hostname || strcmp(share->hostname, my_localhost) == 0)
share->socket= my_strdup(MYSQL_UNIX_ADDR, MYF(0)); share->socket= (char*) MYSQL_UNIX_ADDR;
else else
share->port= MYSQL_PORT; share->port= MYSQL_PORT;
} }
...@@ -1094,10 +1101,20 @@ bool ha_federated::create_where_from_key(String *to, ...@@ -1094,10 +1101,20 @@ bool ha_federated::create_where_from_key(String *to,
{ {
if (*ptr++) if (*ptr++)
{ {
/*
We got "IS [NOT] NULL" condition against nullable column. We
distinguish between "IS NOT NULL" and "IS NULL" by flag. For
"IS NULL", flag is set to HA_READ_KEY_EXACT.
*/
if (emit_key_part_name(&tmp, key_part) || if (emit_key_part_name(&tmp, key_part) ||
tmp.append(FEDERATED_ISNULL)) tmp.append(ranges[i]->flag == HA_READ_KEY_EXACT ?
FEDERATED_ISNULL : " IS NOT NULL "))
DBUG_RETURN(1); DBUG_RETURN(1);
continue; /*
We need to adjust pointer and length to be prepared for next
key part. As well as check if this was last key part.
*/
goto prepare_for_next_key_part;
} }
} }
...@@ -1199,12 +1216,18 @@ bool ha_federated::create_where_from_key(String *to, ...@@ -1199,12 +1216,18 @@ bool ha_federated::create_where_from_key(String *to,
if (tmp.append(FEDERATED_CLOSEPAREN)) if (tmp.append(FEDERATED_CLOSEPAREN))
DBUG_RETURN(1); DBUG_RETURN(1);
prepare_for_next_key_part:
if (store_length >= length) if (store_length >= length)
break; break;
DBUG_PRINT("info", ("remainder %d", remainder)); DBUG_PRINT("info", ("remainder %d", remainder));
DBUG_ASSERT(remainder > 1); DBUG_ASSERT(remainder > 1);
length-= store_length; length-= store_length;
ptr+= store_length; /*
For nullable columns, null-byte is already skipped before, that is
ptr was incremented by 1. Since store_length still counts null-byte,
we need to subtract 1 from store_length.
*/
ptr+= store_length - test(key_part->null_bit);
if (tmp.append(FEDERATED_AND)) if (tmp.append(FEDERATED_AND))
DBUG_RETURN(1); DBUG_RETURN(1);
...@@ -1319,7 +1342,6 @@ static int free_share(FEDERATED_SHARE *share) ...@@ -1319,7 +1342,6 @@ static int free_share(FEDERATED_SHARE *share)
{ {
hash_delete(&federated_open_tables, (byte*) share); hash_delete(&federated_open_tables, (byte*) share);
my_free((gptr) share->scheme, MYF(MY_ALLOW_ZERO_PTR)); my_free((gptr) share->scheme, MYF(MY_ALLOW_ZERO_PTR));
my_free((gptr) share->socket, MYF(MY_ALLOW_ZERO_PTR));
thr_lock_delete(&share->lock); thr_lock_delete(&share->lock);
VOID(pthread_mutex_destroy(&share->mutex)); VOID(pthread_mutex_destroy(&share->mutex));
my_free((gptr) share, MYF(0)); my_free((gptr) share, MYF(0));
......
...@@ -1954,6 +1954,7 @@ my_bool ha_myisam::register_query_cache_table(THD *thd, char *table_name, ...@@ -1954,6 +1954,7 @@ my_bool ha_myisam::register_query_cache_table(THD *thd, char *table_name,
*engine_callback, *engine_callback,
ulonglong *engine_data) ulonglong *engine_data)
{ {
DBUG_ENTER("ha_myisam::register_query_cache_table");
/* /*
No call back function is needed to determine if a cached statement No call back function is needed to determine if a cached statement
is valid or not. is valid or not.
...@@ -1965,39 +1966,48 @@ my_bool ha_myisam::register_query_cache_table(THD *thd, char *table_name, ...@@ -1965,39 +1966,48 @@ my_bool ha_myisam::register_query_cache_table(THD *thd, char *table_name,
*/ */
*engine_data= 0; *engine_data= 0;
/* if (file->s->concurrent_insert)
If a concurrent INSERT has happened just before the currently processed {
SELECT statement, the total size of the table is unknown. /*
If a concurrent INSERT has happened just before the currently
processed SELECT statement, the total size of the table is
unknown.
To determine if the table size is known, the current thread's snap shot of To determine if the table size is known, the current thread's snap
the table size with the actual table size are compared. shot of the table size with the actual table size are compared.
If the table size is unknown the SELECT statement can't be cached. If the table size is unknown the SELECT statement can't be cached.
*/
ulonglong actual_data_file_length;
ulonglong current_data_file_length;
/* When concurrent inserts are disabled at table open, mi_open()
POSIX visibility rules specify that "2. Whatever memory values a does not assign a get_status() function. In this case the local
thread can see when it unlocks a mutex <...> can also be seen by any ("current") status is never updated. We would wrongly think that
thread that later locks the same mutex". In this particular case, we cannot cache the statement.
concurrent insert thread had modified the data_file_length in */
MYISAM_SHARE before it has unlocked (or even locked) ulonglong actual_data_file_length;
structure_guard_mutex. So, here we're guaranteed to see at least that ulonglong current_data_file_length;
value after we've locked the same mutex. We can see a later value
(modified by some other thread) though, but it's ok, as we only want
to know if the variable was changed, the actual new value doesn't matter
*/
actual_data_file_length= file->s->state.state.data_file_length;
current_data_file_length= file->save_state.data_file_length;
if (current_data_file_length != actual_data_file_length) /*
{ POSIX visibility rules specify that "2. Whatever memory values a
/* Don't cache current statement. */ thread can see when it unlocks a mutex <...> can also be seen by any
return FALSE; thread that later locks the same mutex". In this particular case,
concurrent insert thread had modified the data_file_length in
MYISAM_SHARE before it has unlocked (or even locked)
structure_guard_mutex. So, here we're guaranteed to see at least that
value after we've locked the same mutex. We can see a later value
(modified by some other thread) though, but it's ok, as we only want
to know if the variable was changed, the actual new value doesn't matter
*/
actual_data_file_length= file->s->state.state.data_file_length;
current_data_file_length= file->save_state.data_file_length;
if (current_data_file_length != actual_data_file_length)
{
/* Don't cache current statement. */
DBUG_RETURN(FALSE);
}
} }
/* It is ok to try to cache current statement. */ /* It is ok to try to cache current statement. */
return TRUE; DBUG_RETURN(TRUE);
} }
#endif #endif
...@@ -602,6 +602,12 @@ void ha_myisammrg::append_create_info(String *packet) ...@@ -602,6 +602,12 @@ void ha_myisammrg::append_create_info(String *packet)
packet->append(STRING_WITH_LEN(" INSERT_METHOD=")); packet->append(STRING_WITH_LEN(" INSERT_METHOD="));
packet->append(get_type(&merge_insert_method,file->merge_insert_method-1)); packet->append(get_type(&merge_insert_method,file->merge_insert_method-1));
} }
/*
There is no sence adding UNION clause in case there is no underlying
tables specified.
*/
if (file->open_tables == file->end_table)
return;
packet->append(STRING_WITH_LEN(" UNION=(")); packet->append(STRING_WITH_LEN(" UNION=("));
MYRG_TABLE *open_table,*first; MYRG_TABLE *open_table,*first;
......
...@@ -1265,6 +1265,7 @@ bool Item_name_const::fix_fields(THD *thd, Item **ref) ...@@ -1265,6 +1265,7 @@ bool Item_name_const::fix_fields(THD *thd, Item **ref)
return TRUE; return TRUE;
} }
set_name(item_name->ptr(), (uint) item_name->length(), system_charset_info); set_name(item_name->ptr(), (uint) item_name->length(), system_charset_info);
collation.set(value_item->collation.collation, DERIVATION_IMPLICIT);
max_length= value_item->max_length; max_length= value_item->max_length;
decimals= value_item->decimals; decimals= value_item->decimals;
fixed= 1; fixed= 1;
......
...@@ -361,13 +361,13 @@ Item *create_func_space(Item *a) ...@@ -361,13 +361,13 @@ Item *create_func_space(Item *a)
if (cs->mbminlen > 1) if (cs->mbminlen > 1)
{ {
uint dummy_errors; uint dummy_errors;
sp= new Item_string("",0,cs); sp= new Item_string("", 0, cs, DERIVATION_COERCIBLE, MY_REPERTOIRE_ASCII);
if (sp) if (sp)
sp->str_value.copy(" ", 1, &my_charset_latin1, cs, &dummy_errors); sp->str_value.copy(" ", 1, &my_charset_latin1, cs, &dummy_errors);
} }
else else
{ {
sp= new Item_string(" ",1,cs); sp= new Item_string(" ", 1, cs, DERIVATION_COERCIBLE, MY_REPERTOIRE_ASCII);
} }
return sp ? new Item_func_repeat(sp, a) : 0; return sp ? new Item_func_repeat(sp, a) : 0;
} }
......
...@@ -3729,6 +3729,18 @@ longlong Item_func_sleep::val_int() ...@@ -3729,6 +3729,18 @@ longlong Item_func_sleep::val_int()
DBUG_ASSERT(fixed == 1); DBUG_ASSERT(fixed == 1);
double time= args[0]->val_real(); double time= args[0]->val_real();
/*
On 64-bit OSX pthread_cond_timedwait() waits forever
if passed abstime time has already been exceeded by
the system time.
When given a very short timeout (< 10 mcs) just return
immediately.
We assume that the lines between this test and the call
to pthread_cond_timedwait() will be executed in less than 0.00001 sec.
*/
if (time < 0.00001)
return 0;
set_timespec_nsec(abstime, (ulonglong)(time * ULL(1000000000))); set_timespec_nsec(abstime, (ulonglong)(time * ULL(1000000000)));
pthread_cond_init(&cond, NULL); pthread_cond_init(&cond, NULL);
......
...@@ -373,6 +373,7 @@ Log_event::Log_event(const char* buf, ...@@ -373,6 +373,7 @@ Log_event::Log_event(const char* buf,
#endif #endif
when = uint4korr(buf); when = uint4korr(buf);
server_id = uint4korr(buf + SERVER_ID_OFFSET); server_id = uint4korr(buf + SERVER_ID_OFFSET);
data_written= uint4korr(buf + EVENT_LEN_OFFSET);
if (description_event->binlog_version==1) if (description_event->binlog_version==1)
{ {
log_pos= 0; log_pos= 0;
...@@ -405,7 +406,7 @@ Log_event::Log_event(const char* buf, ...@@ -405,7 +406,7 @@ Log_event::Log_event(const char* buf,
binlog, so which will cause problems if the user uses this value binlog, so which will cause problems if the user uses this value
in CHANGE MASTER). in CHANGE MASTER).
*/ */
log_pos+= uint4korr(buf + EVENT_LEN_OFFSET); log_pos+= data_written; /* purecov: inspected */
} }
DBUG_PRINT("info", ("log_pos: %lu", (ulong) log_pos)); DBUG_PRINT("info", ("log_pos: %lu", (ulong) log_pos));
......
...@@ -109,11 +109,14 @@ void change_rpl_status(RPL_STATUS from_status, RPL_STATUS to_status) ...@@ -109,11 +109,14 @@ void change_rpl_status(RPL_STATUS from_status, RPL_STATUS to_status)
} }
#define get_object(p, obj) \ #define get_object(p, obj, msg) \
{\ {\
uint len = (uint)*p++; \ uint len = (uint)*p++; \
if (p + len > p_end || len >= sizeof(obj)) \ if (p + len > p_end || len >= sizeof(obj)) \
{\
errmsg= msg;\
goto err; \ goto err; \
}\
strmake(obj,(char*) p,len); \ strmake(obj,(char*) p,len); \
p+= len; \ p+= len; \
}\ }\
...@@ -158,6 +161,7 @@ int register_slave(THD* thd, uchar* packet, uint packet_length) ...@@ -158,6 +161,7 @@ int register_slave(THD* thd, uchar* packet, uint packet_length)
int res; int res;
SLAVE_INFO *si; SLAVE_INFO *si;
uchar *p= packet, *p_end= packet + packet_length; uchar *p= packet, *p_end= packet + packet_length;
const char *errmsg= "Wrong parameters to function register_slave";
if (check_access(thd, REPL_SLAVE_ACL, any_db,0,0,0,0)) if (check_access(thd, REPL_SLAVE_ACL, any_db,0,0,0,0))
return 1; return 1;
...@@ -166,9 +170,9 @@ int register_slave(THD* thd, uchar* packet, uint packet_length) ...@@ -166,9 +170,9 @@ int register_slave(THD* thd, uchar* packet, uint packet_length)
thd->server_id= si->server_id= uint4korr(p); thd->server_id= si->server_id= uint4korr(p);
p+= 4; p+= 4;
get_object(p,si->host); get_object(p,si->host, "Failed to register slave: too long 'report-host'");
get_object(p,si->user); get_object(p,si->user, "Failed to register slave: too long 'report-user'");
get_object(p,si->password); get_object(p,si->password, "Failed to register slave; too long 'report-password'");
if (p+10 > p_end) if (p+10 > p_end)
goto err; goto err;
si->port= uint2korr(p); si->port= uint2korr(p);
...@@ -187,8 +191,7 @@ int register_slave(THD* thd, uchar* packet, uint packet_length) ...@@ -187,8 +191,7 @@ int register_slave(THD* thd, uchar* packet, uint packet_length)
err: err:
my_free((gptr) si, MYF(MY_WME)); my_free((gptr) si, MYF(MY_WME));
my_message(ER_UNKNOWN_ERROR, "Wrong parameters to function register_slave", my_message(ER_UNKNOWN_ERROR, errmsg, MYF(0)); /* purecov: inspected */
MYF(0));
err2: err2:
return 1; return 1;
} }
......
...@@ -3138,6 +3138,11 @@ int check_expected_error(THD* thd, RELAY_LOG_INFO* rli, int expected_error) ...@@ -3138,6 +3138,11 @@ int check_expected_error(THD* thd, RELAY_LOG_INFO* rli, int expected_error)
Check if condition stated in UNTIL clause of START SLAVE is reached. Check if condition stated in UNTIL clause of START SLAVE is reached.
SYNOPSYS SYNOPSYS
st_relay_log_info::is_until_satisfied() st_relay_log_info::is_until_satisfied()
master_beg_pos position of the beginning of to be executed event
(not log_pos member of the event that points to the
beginning of the following event)
DESCRIPTION DESCRIPTION
Checks if UNTIL condition is reached. Uses caching result of last Checks if UNTIL condition is reached. Uses caching result of last
comparison of current log file name and target log file name. So cached comparison of current log file name and target log file name. So cached
...@@ -3162,7 +3167,7 @@ int check_expected_error(THD* thd, RELAY_LOG_INFO* rli, int expected_error) ...@@ -3162,7 +3167,7 @@ int check_expected_error(THD* thd, RELAY_LOG_INFO* rli, int expected_error)
false - condition not met false - condition not met
*/ */
bool st_relay_log_info::is_until_satisfied() bool st_relay_log_info::is_until_satisfied(my_off_t master_beg_pos)
{ {
const char *log_name; const char *log_name;
ulonglong log_pos; ulonglong log_pos;
...@@ -3172,7 +3177,7 @@ bool st_relay_log_info::is_until_satisfied() ...@@ -3172,7 +3177,7 @@ bool st_relay_log_info::is_until_satisfied()
if (until_condition == UNTIL_MASTER_POS) if (until_condition == UNTIL_MASTER_POS)
{ {
log_name= group_master_log_name; log_name= group_master_log_name;
log_pos= group_master_log_pos; log_pos= master_beg_pos;
} }
else else
{ /* until_condition == UNTIL_RELAY_POS */ { /* until_condition == UNTIL_RELAY_POS */
...@@ -3251,28 +3256,6 @@ static int exec_relay_log_event(THD* thd, RELAY_LOG_INFO* rli) ...@@ -3251,28 +3256,6 @@ static int exec_relay_log_event(THD* thd, RELAY_LOG_INFO* rli)
wait for something for example inside of next_event(). wait for something for example inside of next_event().
*/ */
pthread_mutex_lock(&rli->data_lock); pthread_mutex_lock(&rli->data_lock);
/*
This tests if the position of the end of the last previous executed event
hits the UNTIL barrier.
We would prefer to test if the position of the start (or possibly) end of
the to-be-read event hits the UNTIL barrier, this is different if there
was an event ignored by the I/O thread just before (BUG#13861 to be
fixed).
*/
if (rli->until_condition!=RELAY_LOG_INFO::UNTIL_NONE &&
rli->is_until_satisfied())
{
char buf[22];
sql_print_information("Slave SQL thread stopped because it reached its"
" UNTIL position %s", llstr(rli->until_pos(), buf));
/*
Setting abort_slave flag because we do not want additional message about
error in query execution to be printed.
*/
rli->abort_slave= 1;
pthread_mutex_unlock(&rli->data_lock);
return 1;
}
Log_event * ev = next_event(rli); Log_event * ev = next_event(rli);
...@@ -3289,6 +3272,27 @@ static int exec_relay_log_event(THD* thd, RELAY_LOG_INFO* rli) ...@@ -3289,6 +3272,27 @@ static int exec_relay_log_event(THD* thd, RELAY_LOG_INFO* rli)
int type_code = ev->get_type_code(); int type_code = ev->get_type_code();
int exec_res; int exec_res;
/*
This tests if the position of the beginning of the current event
hits the UNTIL barrier.
*/
if (rli->until_condition != RELAY_LOG_INFO::UNTIL_NONE &&
rli->is_until_satisfied((thd->options & OPTION_BEGIN || !ev->log_pos) ?
rli->group_master_log_pos :
ev->log_pos - ev->data_written))
{
char buf[22];
sql_print_information("Slave SQL thread stopped because it reached its"
" UNTIL position %s", llstr(rli->until_pos(), buf));
/*
Setting abort_slave flag because we do not want additional message about
error in query execution to be printed.
*/
rli->abort_slave= 1;
pthread_mutex_unlock(&rli->data_lock);
delete ev;
return 1;
}
/* /*
Queries originating from this server must be skipped. Queries originating from this server must be skipped.
Low-level events (Format_desc, Rotate, Stop) from this server Low-level events (Format_desc, Rotate, Stop) from this server
...@@ -4000,6 +4004,22 @@ Slave SQL thread aborted. Can't execute init_slave query"); ...@@ -4000,6 +4004,22 @@ Slave SQL thread aborted. Can't execute init_slave query");
} }
} }
/*
First check until condition - probably there is nothing to execute. We
do not want to wait for next event in this case.
*/
pthread_mutex_lock(&rli->data_lock);
if (rli->until_condition != RELAY_LOG_INFO::UNTIL_NONE &&
rli->is_until_satisfied(rli->group_master_log_pos))
{
char buf[22];
sql_print_information("Slave SQL thread stopped because it reached its"
" UNTIL position %s", llstr(rli->until_pos(), buf));
pthread_mutex_unlock(&rli->data_lock);
goto err;
}
pthread_mutex_unlock(&rli->data_lock);
/* Read queries from the IO/THREAD until this thread is killed */ /* Read queries from the IO/THREAD until this thread is killed */
while (!sql_slave_killed(thd,rli)) while (!sql_slave_killed(thd,rli))
......
...@@ -348,7 +348,7 @@ typedef struct st_relay_log_info ...@@ -348,7 +348,7 @@ typedef struct st_relay_log_info
void close_temporary_tables(); void close_temporary_tables();
/* Check if UNTIL condition is satisfied. See slave.cc for more. */ /* Check if UNTIL condition is satisfied. See slave.cc for more. */
bool is_until_satisfied(); bool is_until_satisfied(my_off_t master_beg_pos);
inline ulonglong until_pos() inline ulonglong until_pos()
{ {
return ((until_condition == UNTIL_MASTER_POS) ? group_master_log_pos : return ((until_condition == UNTIL_MASTER_POS) ? group_master_log_pos :
......
...@@ -2934,7 +2934,7 @@ create_table_option: ...@@ -2934,7 +2934,7 @@ create_table_option:
my_error(ER_WARN_DEPRECATED_SYNTAX, MYF(0), "RAID_CHUNKSIZE", "PARTITION"); my_error(ER_WARN_DEPRECATED_SYNTAX, MYF(0), "RAID_CHUNKSIZE", "PARTITION");
MYSQL_YYABORT; MYSQL_YYABORT;
} }
| UNION_SYM opt_equal '(' table_list ')' | UNION_SYM opt_equal '(' opt_table_list ')'
{ {
/* Move the union list to the merge_list */ /* Move the union list to the merge_list */
LEX *lex=Lex; LEX *lex=Lex;
......
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