mirror of
https://github.com/MariaDB/server.git
synced 2025-01-17 04:22:27 +01:00
Merge trift2.:/MySQL/M50/mysql-5.0
into trift2.:/MySQL/M50/push-5.0 configure.in: Auto merged
This commit is contained in:
commit
9878e861a2
44 changed files with 844 additions and 105 deletions
|
@ -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)
|
||||||
} 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)
|
||||||
} 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)
|
||||||
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)
|
||||||
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
|
||||||
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)
|
||||||
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)
|
||||||
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)
|
||||||
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)
|
||||||
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 @@
|
||||||
|
|
||||||
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;
|
||||||
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';
|
||||||
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));
|
||||||
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;
|
||||||
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';
|
||||||
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));
|
||||||
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';
|
||||||
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));
|
||||||
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';
|
||||||
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));
|
||||||
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';
|
||||||
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));
|
||||||
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';
|
||||||
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));
|
||||||
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;
|
||||||
|
|
|
@ -1,4 +1,97 @@
|
||||||
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');
|
||||||
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;
|
||||||
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);
|
||||||
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
|
||||||
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;
|
||||||
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;
|
||||||
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
|
||||||
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;
|
||||||
|
|
||||||
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 @@
|
||||||
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');
|
||||||
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;
|
||||||
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);
|
||||||
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;
|
||||||
|
|
||||||
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;
|
||||||
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
|
||||||
|
|
1
mysql-test/t/rpl_dual_pos_advance-slave.opt
Normal file
1
mysql-test/t/rpl_dual_pos_advance-slave.opt
Normal file
|
@ -0,0 +1 @@
|
||||||
|
--innodb
|
|
@ -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;
|
||||||
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;
|
||||||
|
|
||||||
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;
|
||||||
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);
|
||||||
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,
|
||||||
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,
|
||||||
{
|
{
|
||||||
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,
|
||||||
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)
|
||||||
{
|
{
|
||||||
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,
|
||||||
*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,
|
||||||
*/
|
*/
|
||||||
*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.
|
|
||||||
|
|
||||||
To determine if the table size is known, the current thread's snap 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.
|
|
||||||
*/
|
|
||||||
ulonglong actual_data_file_length;
|
|
||||||
ulonglong current_data_file_length;
|
|
||||||
|
|
||||||
/*
|
|
||||||
POSIX visibility rules specify that "2. Whatever memory values a
|
|
||||||
thread can see when it unlocks a mutex <...> can also be seen by any
|
|
||||||
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. */
|
/*
|
||||||
return FALSE;
|
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 the table size with the actual table size are compared.
|
||||||
|
|
||||||
|
If the table size is unknown the SELECT statement can't be cached.
|
||||||
|
|
||||||
|
When concurrent inserts are disabled at table open, mi_open()
|
||||||
|
does not assign a get_status() function. In this case the local
|
||||||
|
("current") status is never updated. We would wrongly think that
|
||||||
|
we cannot cache the statement.
|
||||||
|
*/
|
||||||
|
ulonglong actual_data_file_length;
|
||||||
|
ulonglong current_data_file_length;
|
||||||
|
|
||||||
|
/*
|
||||||
|
POSIX visibility rules specify that "2. Whatever memory values a
|
||||||
|
thread can see when it unlocks a mutex <...> can also be seen by any
|
||||||
|
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)
|
||||||
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)
|
||||||
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)
|
||||||
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()
|
||||||
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,
|
||||||
#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,
|
||||||
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)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#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)
|
||||||
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)
|
||||||
|
|
||||||
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)
|
||||||
|
|
||||||
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;
|
||||||
}
|
}
|
||||||
|
|
68
sql/slave.cc
68
sql/slave.cc
|
@ -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)
|
||||||
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()
|
||||||
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)
|
||||||
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)
|
||||||
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");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
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
|
||||||
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:
|
||||||
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;
|
||||||
|
|
Loading…
Reference in a new issue