Manual merge from mysql-trunk-merge.
Conflicts: - configure.in - include/m_string.h - mysql-test/extra/rpl_tests/rpl_row_func003.test - mysql-test/r/mysqlbinlog.result - mysql-test/r/union.result - mysql-test/suite/binlog/r/binlog_killed_simulate.result - mysql-test/suite/binlog/r/binlog_row_mix_innodb_myisam.result - mysql-test/suite/binlog/r/binlog_unsafe.result - mysql-test/suite/binlog/t/binlog_unsafe.test - mysql-test/suite/rpl/r/rpl_loaddata_fatal.result - mysql-test/suite/rpl/r/rpl_loaddata_map.result - mysql-test/suite/rpl/r/rpl_stm_loaddata_concurrent.result - mysql-test/suite/rpl/r/rpl_stm_log.result - mysql-test/suite/rpl/t/rpl_optimize.test - mysql-test/t/mysqlbinlog.test - mysql-test/t/union.test - sql/rpl_utility.h - sql/sql_union.cc - strings/Makefile.am
This commit is contained in:
commit
a6667f8577
@ -4283,7 +4283,7 @@ char *get_arg(char *line, my_bool get_next_arg)
|
|||||||
if (*ptr == '\\' && ptr[1]) // escaped character
|
if (*ptr == '\\' && ptr[1]) // escaped character
|
||||||
{
|
{
|
||||||
// Remove the backslash
|
// Remove the backslash
|
||||||
strmov(ptr, ptr+1);
|
strmov_overlapp(ptr, ptr+1);
|
||||||
}
|
}
|
||||||
else if ((!quoted && *ptr == ' ') || (quoted && *ptr == qtype))
|
else if ((!quoted && *ptr == ' ') || (quoted && *ptr == qtype))
|
||||||
{
|
{
|
||||||
|
13
configure.in
13
configure.in
@ -46,12 +46,14 @@ NDB_SHARED_LIB_VERSION=$NDB_SHARED_LIB_MAJOR_VERSION:0:0
|
|||||||
# Remember that regexps needs to quote [ and ] since this is run through m4
|
# Remember that regexps needs to quote [ and ] since this is run through m4
|
||||||
# We take some made up examples
|
# We take some made up examples
|
||||||
#
|
#
|
||||||
# VERSION 5.1.40sp1-alpha 5.0.34a
|
# VERSION 5.1.40sp1-alpha 5.0.34a 5.5.1-m2
|
||||||
# MYSQL_NO_DASH_VERSION 5.1.40sp1 5.0.34a
|
# MYSQL_U_SCORE_VERSION 5.1.40sp1_alpha 5.0.34a 5.5.1_m2
|
||||||
# MYSQL_NUMERIC_VERSION 5.1.40 5.0.34
|
# MYSQL_NO_DASH_VERSION 5.1.40sp1 5.0.34a 5.5.1
|
||||||
# MYSQL_BASE_VERSION 5.1 5.0
|
# MYSQL_NUMERIC_VERSION 5.1.40 5.0.34 5.5.1
|
||||||
# MYSQL_VERSION_ID 50140 50034
|
# MYSQL_BASE_VERSION 5.1 5.0 5.5
|
||||||
|
# MYSQL_VERSION_ID 50140 50034 50501
|
||||||
#
|
#
|
||||||
|
MYSQL_U_SCORE_VERSION=`echo $VERSION | sed -e "s|-|_|"`
|
||||||
MYSQL_NO_DASH_VERSION=`echo $VERSION | sed -e "s|-.*$||"`
|
MYSQL_NO_DASH_VERSION=`echo $VERSION | sed -e "s|-.*$||"`
|
||||||
MYSQL_NUMERIC_VERSION=`echo $MYSQL_NO_DASH_VERSION | sed -e "s|[[a-z]][[a-z0-9]]*$||"`
|
MYSQL_NUMERIC_VERSION=`echo $MYSQL_NO_DASH_VERSION | sed -e "s|[[a-z]][[a-z0-9]]*$||"`
|
||||||
MYSQL_BASE_VERSION=`echo $MYSQL_NUMERIC_VERSION | sed -e "s|\.[[^.]]*$||"`
|
MYSQL_BASE_VERSION=`echo $MYSQL_NUMERIC_VERSION | sed -e "s|\.[[^.]]*$||"`
|
||||||
@ -89,6 +91,7 @@ romanian russian serbian slovak spanish swedish ukrainian"
|
|||||||
#####
|
#####
|
||||||
#####
|
#####
|
||||||
|
|
||||||
|
AC_SUBST(MYSQL_U_SCORE_VERSION)
|
||||||
AC_SUBST(MYSQL_NO_DASH_VERSION)
|
AC_SUBST(MYSQL_NO_DASH_VERSION)
|
||||||
AC_SUBST(MYSQL_BASE_VERSION)
|
AC_SUBST(MYSQL_BASE_VERSION)
|
||||||
AC_SUBST(MYSQL_VERSION_ID)
|
AC_SUBST(MYSQL_VERSION_ID)
|
||||||
|
@ -305,6 +305,7 @@ private:
|
|||||||
bool ValidateSignature(SignerList*);
|
bool ValidateSignature(SignerList*);
|
||||||
bool ConfirmSignature(Source&);
|
bool ConfirmSignature(Source&);
|
||||||
void GetKey();
|
void GetKey();
|
||||||
|
char* AddTag(char*, const char*, const char*, word32, word32);
|
||||||
void GetName(NameType);
|
void GetName(NameType);
|
||||||
void GetValidity();
|
void GetValidity();
|
||||||
void GetDate(DateType);
|
void GetDate(DateType);
|
||||||
|
@ -652,6 +652,23 @@ word32 CertDecoder::GetDigest()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
char *CertDecoder::AddTag(char *ptr, const char *buf_end,
|
||||||
|
const char *tag_name, word32 tag_name_length,
|
||||||
|
word32 tag_value_length)
|
||||||
|
{
|
||||||
|
if (ptr + tag_name_length + tag_value_length > buf_end)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
memcpy(ptr, tag_name, tag_name_length);
|
||||||
|
ptr+= tag_name_length;
|
||||||
|
|
||||||
|
memcpy(ptr, source_.get_current(), tag_value_length);
|
||||||
|
ptr+= tag_value_length;
|
||||||
|
|
||||||
|
return ptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// process NAME, either issuer or subject
|
// process NAME, either issuer or subject
|
||||||
void CertDecoder::GetName(NameType nt)
|
void CertDecoder::GetName(NameType nt)
|
||||||
{
|
{
|
||||||
@ -659,11 +676,21 @@ void CertDecoder::GetName(NameType nt)
|
|||||||
|
|
||||||
SHA sha;
|
SHA sha;
|
||||||
word32 length = GetSequence(); // length of all distinguished names
|
word32 length = GetSequence(); // length of all distinguished names
|
||||||
assert (length < ASN_NAME_MAX);
|
|
||||||
|
if (length >= ASN_NAME_MAX)
|
||||||
|
goto err;
|
||||||
length += source_.get_index();
|
length += source_.get_index();
|
||||||
|
|
||||||
char* ptr = (nt == ISSUER) ? issuer_ : subject_;
|
char *ptr, *buf_end;
|
||||||
word32 idx = 0;
|
|
||||||
|
if (nt == ISSUER) {
|
||||||
|
ptr= issuer_;
|
||||||
|
buf_end= ptr + sizeof(issuer_) - 1; // 1 byte for trailing 0
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
ptr= subject_;
|
||||||
|
buf_end= ptr + sizeof(subject_) - 1; // 1 byte for trailing 0
|
||||||
|
}
|
||||||
|
|
||||||
while (source_.get_index() < length) {
|
while (source_.get_index() < length) {
|
||||||
GetSet();
|
GetSet();
|
||||||
@ -685,47 +712,36 @@ void CertDecoder::GetName(NameType nt)
|
|||||||
byte id = source_.next();
|
byte id = source_.next();
|
||||||
b = source_.next(); // strType
|
b = source_.next(); // strType
|
||||||
word32 strLen = GetLength(source_);
|
word32 strLen = GetLength(source_);
|
||||||
bool copy = false;
|
|
||||||
|
|
||||||
if (id == COMMON_NAME) {
|
switch (id) {
|
||||||
memcpy(&ptr[idx], "/CN=", 4);
|
case COMMON_NAME:
|
||||||
idx += 4;
|
if (!(ptr= AddTag(ptr, buf_end, "/CN=", 4, strLen)))
|
||||||
copy = true;
|
goto err;
|
||||||
}
|
break;
|
||||||
else if (id == SUR_NAME) {
|
case SUR_NAME:
|
||||||
memcpy(&ptr[idx], "/SN=", 4);
|
if (!(ptr= AddTag(ptr, buf_end, "/SN=", 4, strLen)))
|
||||||
idx += 4;
|
goto err;
|
||||||
copy = true;
|
break;
|
||||||
}
|
case COUNTRY_NAME:
|
||||||
else if (id == COUNTRY_NAME) {
|
if (!(ptr= AddTag(ptr, buf_end, "/C=", 3, strLen)))
|
||||||
memcpy(&ptr[idx], "/C=", 3);
|
goto err;
|
||||||
idx += 3;
|
break;
|
||||||
copy = true;
|
case LOCALITY_NAME:
|
||||||
}
|
if (!(ptr= AddTag(ptr, buf_end, "/L=", 3, strLen)))
|
||||||
else if (id == LOCALITY_NAME) {
|
goto err;
|
||||||
memcpy(&ptr[idx], "/L=", 3);
|
break;
|
||||||
idx += 3;
|
case STATE_NAME:
|
||||||
copy = true;
|
if (!(ptr= AddTag(ptr, buf_end, "/ST=", 4, strLen)))
|
||||||
}
|
goto err;
|
||||||
else if (id == STATE_NAME) {
|
break;
|
||||||
memcpy(&ptr[idx], "/ST=", 4);
|
case ORG_NAME:
|
||||||
idx += 4;
|
if (!(ptr= AddTag(ptr, buf_end, "/O=", 3, strLen)))
|
||||||
copy = true;
|
goto err;
|
||||||
}
|
break;
|
||||||
else if (id == ORG_NAME) {
|
case ORGUNIT_NAME:
|
||||||
memcpy(&ptr[idx], "/O=", 3);
|
if (!(ptr= AddTag(ptr, buf_end, "/OU=", 4, strLen)))
|
||||||
idx += 3;
|
goto err;
|
||||||
copy = true;
|
break;
|
||||||
}
|
|
||||||
else if (id == ORGUNIT_NAME) {
|
|
||||||
memcpy(&ptr[idx], "/OU=", 4);
|
|
||||||
idx += 4;
|
|
||||||
copy = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (copy) {
|
|
||||||
memcpy(&ptr[idx], source_.get_current(), strLen);
|
|
||||||
idx += strLen;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
sha.Update(source_.get_current(), strLen);
|
sha.Update(source_.get_current(), strLen);
|
||||||
@ -739,23 +755,20 @@ void CertDecoder::GetName(NameType nt)
|
|||||||
source_.advance(oidSz + 1);
|
source_.advance(oidSz + 1);
|
||||||
word32 length = GetLength(source_);
|
word32 length = GetLength(source_);
|
||||||
|
|
||||||
if (email) {
|
if (email && !(ptr= AddTag(ptr, buf_end, "/emailAddress=", 14, length)))
|
||||||
memcpy(&ptr[idx], "/emailAddress=", 14);
|
goto err;
|
||||||
idx += 14;
|
|
||||||
|
|
||||||
memcpy(&ptr[idx], source_.get_current(), length);
|
|
||||||
idx += length;
|
|
||||||
}
|
|
||||||
|
|
||||||
source_.advance(length);
|
source_.advance(length);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ptr[idx++] = 0;
|
*ptr= 0;
|
||||||
|
|
||||||
if (nt == ISSUER)
|
sha.Final(nt == ISSUER ? issuerHash_ : subjectHash_);
|
||||||
sha.Final(issuerHash_);
|
|
||||||
else
|
return;
|
||||||
sha.Final(subjectHash_);
|
|
||||||
|
err:
|
||||||
|
source_.SetError(CONTENT_E);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -92,9 +92,7 @@ extern char *stpcpy(char *, const char *); /* For AIX with gcc 2.95.3 */
|
|||||||
extern char NEAR _dig_vec_upper[];
|
extern char NEAR _dig_vec_upper[];
|
||||||
extern char NEAR _dig_vec_lower[];
|
extern char NEAR _dig_vec_lower[];
|
||||||
|
|
||||||
#ifdef BAD_STRING_COMPILER
|
#ifndef strmov
|
||||||
#define strmov(A,B) (memccpy(A,B,0,INT_MAX)-1)
|
|
||||||
#else
|
|
||||||
#define strmov_overlapp(A,B) strmov(A,B)
|
#define strmov_overlapp(A,B) strmov(A,B)
|
||||||
#define strmake_overlapp(A,B,C) strmake(A,B,C)
|
#define strmake_overlapp(A,B,C) strmake(A,B,C)
|
||||||
#endif
|
#endif
|
||||||
@ -152,12 +150,11 @@ extern size_t strinstr(const char *str,const char *search);
|
|||||||
extern size_t r_strinstr(const char *str, size_t from, const char *search);
|
extern size_t r_strinstr(const char *str, size_t from, const char *search);
|
||||||
extern char *strkey(char *dst,char *head,char *tail,char *flags);
|
extern char *strkey(char *dst,char *head,char *tail,char *flags);
|
||||||
extern char *strmake(char *dst,const char *src,size_t length);
|
extern char *strmake(char *dst,const char *src,size_t length);
|
||||||
#ifndef strmake_overlapp
|
|
||||||
extern char *strmake_overlapp(char *dst,const char *src, size_t length);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef strmov
|
#ifndef strmov
|
||||||
extern char *strmov(char *dst,const char *src);
|
extern char *strmov(char *dst,const char *src);
|
||||||
|
#else
|
||||||
|
extern char *strmov_overlapp(char *dst,const char *src);
|
||||||
#endif
|
#endif
|
||||||
extern char *strnmov(char *dst,const char *src,size_t n);
|
extern char *strnmov(char *dst,const char *src,size_t n);
|
||||||
extern char *strsuff(const char *src,const char *suffix);
|
extern char *strsuff(const char *src,const char *suffix);
|
||||||
|
@ -237,4 +237,18 @@ source include/diff_tables.inc;
|
|||||||
|
|
||||||
-- sync_slave_with_master
|
-- sync_slave_with_master
|
||||||
|
|
||||||
|
# BUG#49479: LOAD DATA INFILE is binlogged without escaping field names
|
||||||
|
-- source include/master-slave-reset.inc
|
||||||
|
-- connection master
|
||||||
|
use test;
|
||||||
|
CREATE TABLE t1 (`key` TEXT, `text` TEXT);
|
||||||
|
|
||||||
|
LOAD DATA INFILE '../../std_data/loaddata2.dat' REPLACE INTO TABLE `t1` FIELDS TERMINATED BY ',';
|
||||||
|
SELECT * FROM t1;
|
||||||
|
|
||||||
|
-- sync_slave_with_master
|
||||||
|
-- connection master
|
||||||
|
DROP TABLE t1;
|
||||||
|
-- sync_slave_with_master
|
||||||
|
|
||||||
# End of 4.1 tests
|
# End of 4.1 tests
|
||||||
|
@ -15,6 +15,8 @@
|
|||||||
# Vs slave. #
|
# Vs slave. #
|
||||||
#############################################################################
|
#############################################################################
|
||||||
|
|
||||||
|
CALL mtr.add_suppression('Statement may not be safe to log in statement format.');
|
||||||
|
|
||||||
# Begin clean up test section
|
# Begin clean up test section
|
||||||
connection master;
|
connection master;
|
||||||
--disable_warnings
|
--disable_warnings
|
||||||
@ -39,12 +41,16 @@ RETURN tmp;
|
|||||||
END|
|
END|
|
||||||
delimiter ;|
|
delimiter ;|
|
||||||
|
|
||||||
|
--disable_warnings
|
||||||
INSERT INTO test.t1 VALUES (null,test.f1()),(null,test.f1()),(null,test.f1());
|
INSERT INTO test.t1 VALUES (null,test.f1()),(null,test.f1()),(null,test.f1());
|
||||||
INSERT INTO test.t1 VALUES (null,test.f1()),(null,test.f1()),(null,test.f1());
|
INSERT INTO test.t1 VALUES (null,test.f1()),(null,test.f1()),(null,test.f1());
|
||||||
|
--enable_warnings
|
||||||
|
|
||||||
SET AUTOCOMMIT=0;
|
SET AUTOCOMMIT=0;
|
||||||
START TRANSACTION;
|
START TRANSACTION;
|
||||||
|
--disable_warnings
|
||||||
INSERT INTO test.t1 VALUES (null,test.f1());
|
INSERT INTO test.t1 VALUES (null,test.f1());
|
||||||
|
--enable_warnings
|
||||||
ROLLBACK;
|
ROLLBACK;
|
||||||
SET AUTOCOMMIT=1;
|
SET AUTOCOMMIT=1;
|
||||||
|
|
||||||
|
16
mysql-test/include/truncate_file.inc
Normal file
16
mysql-test/include/truncate_file.inc
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
# truncate a giving file, all contents of the file are be cleared
|
||||||
|
|
||||||
|
if (`SELECT 'x$file' = 'x'`)
|
||||||
|
{
|
||||||
|
--echo Please assign a file name to $file!!
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
let TRUNCATE_FILE= $file;
|
||||||
|
|
||||||
|
perl;
|
||||||
|
use Env;
|
||||||
|
Env::import('TRUNCATE_FILE');
|
||||||
|
open FILE, '>', $TRUNCATE_FILE || die "Can not open file $file";
|
||||||
|
close FILE;
|
||||||
|
EOF
|
@ -1338,6 +1338,13 @@ ALTER TABLE t1 CHANGE COLUMN f1 f1_no_real_change TIMESTAMP NULL DEFAULT NULL;
|
|||||||
affected rows: 0
|
affected rows: 0
|
||||||
info: Records: 0 Duplicates: 0 Warnings: 0
|
info: Records: 0 Duplicates: 0 Warnings: 0
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
|
#
|
||||||
|
# Bug #31145: ALTER TABLE DROP COLUMN, ADD COLUMN crashes (linux)
|
||||||
|
# or freezes (win) the server
|
||||||
|
#
|
||||||
|
CREATE TABLE t1 (a TEXT, id INT, b INT);
|
||||||
|
ALTER TABLE t1 DROP COLUMN a, ADD COLUMN c TEXT FIRST;
|
||||||
|
DROP TABLE t1;
|
||||||
End of 5.1 tests
|
End of 5.1 tests
|
||||||
CREATE TABLE t1(c CHAR(10),
|
CREATE TABLE t1(c CHAR(10),
|
||||||
i INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY);
|
i INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY);
|
||||||
|
@ -40,6 +40,26 @@ select t2.isbn,city,t1.libname,count(distinct t1.libname) as a from t3 left join
|
|||||||
isbn city libname a
|
isbn city libname a
|
||||||
007 Berkeley Berkeley Public1 2
|
007 Berkeley Berkeley Public1 2
|
||||||
000 New York New York Public Libra 2
|
000 New York New York Public Libra 2
|
||||||
|
select t2.isbn,city,@bar:=t1.libname,count(distinct t1.libname) as a
|
||||||
|
from t3 left join t1 on t3.libname=t1.libname left join t2
|
||||||
|
on t3.isbn=t2.isbn group by city having count(distinct
|
||||||
|
t1.libname) > 1;
|
||||||
|
isbn city @bar:=t1.libname a
|
||||||
|
007 Berkeley Berkeley Public1 2
|
||||||
|
000 New York New York Public Libra 2
|
||||||
|
SELECT @bar;
|
||||||
|
@bar
|
||||||
|
Berkeley Public2
|
||||||
|
select t2.isbn,city,concat(@bar:=t1.libname),count(distinct t1.libname) as a
|
||||||
|
from t3 left join t1 on t3.libname=t1.libname left join t2
|
||||||
|
on t3.isbn=t2.isbn group by city having count(distinct
|
||||||
|
t1.libname) > 1;
|
||||||
|
isbn city concat(@bar:=t1.libname) a
|
||||||
|
007 Berkeley Berkeley Public1 2
|
||||||
|
000 New York New York Public Libra 2
|
||||||
|
SELECT @bar;
|
||||||
|
@bar
|
||||||
|
Berkeley Public2
|
||||||
drop table t1, t2, t3;
|
drop table t1, t2, t3;
|
||||||
create table t1 (f1 int);
|
create table t1 (f1 int);
|
||||||
insert into t1 values (1);
|
insert into t1 values (1);
|
||||||
|
@ -126,7 +126,7 @@ group by
|
|||||||
a.text, b.id, b.betreff
|
a.text, b.id, b.betreff
|
||||||
order by
|
order by
|
||||||
match(b.betreff) against ('+abc' in boolean mode) desc;
|
match(b.betreff) against ('+abc' in boolean mode) desc;
|
||||||
ERROR 42S22: Unknown column 'b.betreff' in 'order clause'
|
ERROR 42000: Incorrect usage/placement of 'MATCH()'
|
||||||
select a.text, b.id, b.betreff
|
select a.text, b.id, b.betreff
|
||||||
from
|
from
|
||||||
t2 a inner join t3 b on a.id = b.forum inner join
|
t2 a inner join t3 b on a.id = b.forum inner join
|
||||||
@ -142,7 +142,7 @@ where
|
|||||||
match(c.beitrag) against ('+abc' in boolean mode)
|
match(c.beitrag) against ('+abc' in boolean mode)
|
||||||
order by
|
order by
|
||||||
match(b.betreff) against ('+abc' in boolean mode) desc;
|
match(b.betreff) against ('+abc' in boolean mode) desc;
|
||||||
ERROR 42S22: Unknown column 'b.betreff' in 'order clause'
|
ERROR 42000: Incorrect usage/placement of 'MATCH()'
|
||||||
select a.text, b.id, b.betreff
|
select a.text, b.id, b.betreff
|
||||||
from
|
from
|
||||||
t2 a inner join t3 b on a.id = b.forum inner join
|
t2 a inner join t3 b on a.id = b.forum inner join
|
||||||
@ -158,7 +158,7 @@ where
|
|||||||
match(c.beitrag) against ('+abc' in boolean mode)
|
match(c.beitrag) against ('+abc' in boolean mode)
|
||||||
order by
|
order by
|
||||||
match(betreff) against ('+abc' in boolean mode) desc;
|
match(betreff) against ('+abc' in boolean mode) desc;
|
||||||
text id betreff
|
ERROR 42000: Incorrect usage/placement of 'MATCH()'
|
||||||
(select b.id, b.betreff from t3 b) union
|
(select b.id, b.betreff from t3 b) union
|
||||||
(select b.id, b.betreff from t3 b)
|
(select b.id, b.betreff from t3 b)
|
||||||
order by match(betreff) against ('+abc' in boolean mode) desc;
|
order by match(betreff) against ('+abc' in boolean mode) desc;
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
DROP TABLE IF EXISTS t1;
|
DROP TABLE IF EXISTS t1;
|
||||||
|
DROP PROCEDURE IF EXISTS p1;
|
||||||
CREATE TABLE t1 ( number INT NOT NULL, alpha CHAR(6) NOT NULL );
|
CREATE TABLE t1 ( number INT NOT NULL, alpha CHAR(6) NOT NULL );
|
||||||
INSERT INTO t1 VALUES (1413006,'idlfmv'),
|
INSERT INTO t1 VALUES (1413006,'idlfmv'),
|
||||||
(1413065,'smpsfz'),(1413127,'sljrhx'),(1413304,'qerfnd');
|
(1413065,'smpsfz'),(1413127,'sljrhx'),(1413304,'qerfnd');
|
||||||
@ -119,4 +120,14 @@ id select_type table type possible_keys key key_len ref rows Extra
|
|||||||
1 SIMPLE t2 index NULL PRIMARY 102 NULL 3 Using index
|
1 SIMPLE t2 index NULL PRIMARY 102 NULL 3 Using index
|
||||||
1 SIMPLE t1 eq_ref PRIMARY,a PRIMARY 318 func,const,const 1
|
1 SIMPLE t1 eq_ref PRIMARY,a PRIMARY 318 func,const,const 1
|
||||||
DROP TABLE t1, t2;
|
DROP TABLE t1, t2;
|
||||||
|
#
|
||||||
|
# Bug #50096: CONCAT_WS inside procedure returning wrong data
|
||||||
|
#
|
||||||
|
CREATE PROCEDURE p1(a varchar(255), b int, c int)
|
||||||
|
SET @query = CONCAT_WS(",", a, b, c);
|
||||||
|
CALL p1("abcde", "0", "1234");
|
||||||
|
SELECT @query;
|
||||||
|
@query
|
||||||
|
abcde,0,1234
|
||||||
|
DROP PROCEDURE p1;
|
||||||
# End of 5.1 tests
|
# End of 5.1 tests
|
||||||
|
@ -1942,6 +1942,28 @@ execute stmt;
|
|||||||
deallocate prepare stmt;
|
deallocate prepare stmt;
|
||||||
drop table t1,t2;
|
drop table t1,t2;
|
||||||
#
|
#
|
||||||
|
#
|
||||||
|
# Bug #49570: Assertion failed: !(order->used & map)
|
||||||
|
# on re-execution of prepared statement
|
||||||
|
#
|
||||||
|
CREATE TABLE t1(a INT PRIMARY KEY);
|
||||||
|
INSERT INTO t1 VALUES(0), (1);
|
||||||
|
PREPARE stmt FROM
|
||||||
|
"SELECT 1 FROM t1 JOIN t1 t2 USING(a) GROUP BY t2.a, t1.a";
|
||||||
|
EXECUTE stmt;
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
EXECUTE stmt;
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
EXECUTE stmt;
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
DEALLOCATE PREPARE stmt;
|
||||||
|
DROP TABLE t1;
|
||||||
End of 5.0 tests.
|
End of 5.0 tests.
|
||||||
create procedure proc_1() reset query cache;
|
create procedure proc_1() reset query cache;
|
||||||
call proc_1();
|
call proc_1();
|
||||||
|
@ -6929,6 +6929,22 @@ CALL p1();
|
|||||||
CALL p1();
|
CALL p1();
|
||||||
DROP PROCEDURE p1;
|
DROP PROCEDURE p1;
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
|
CREATE TABLE t1 ( f1 integer, primary key (f1));
|
||||||
|
CREATE TABLE t2 LIKE t1;
|
||||||
|
CREATE TEMPORARY TABLE t3 LIKE t1;
|
||||||
|
CREATE PROCEDURE p1 () BEGIN SELECT f1 FROM t3 AS A WHERE A.f1 IN ( SELECT f1 FROM t3 ) ;
|
||||||
|
END|
|
||||||
|
CALL p1;
|
||||||
|
ERROR HY000: Can't reopen table: 'A'
|
||||||
|
CREATE VIEW t3 AS SELECT f1 FROM t2 A WHERE A.f1 IN ( SELECT f1 FROM t2 );
|
||||||
|
DROP TABLE t3;
|
||||||
|
CALL p1;
|
||||||
|
f1
|
||||||
|
CALL p1;
|
||||||
|
f1
|
||||||
|
DROP PROCEDURE p1;
|
||||||
|
DROP TABLE t1, t2;
|
||||||
|
DROP VIEW t3;
|
||||||
#
|
#
|
||||||
# Bug #46629: Item_in_subselect::val_int(): Assertion `0'
|
# Bug #46629: Item_in_subselect::val_int(): Assertion `0'
|
||||||
# on subquery inside a SP
|
# on subquery inside a SP
|
||||||
|
23
mysql-test/r/sp_sync.result
Normal file
23
mysql-test/r/sp_sync.result
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
Tests of syncronization of stored procedure execution.
|
||||||
|
#
|
||||||
|
# Bug#48157: crash in Item_field::used_tables
|
||||||
|
#
|
||||||
|
CREATE TABLE t1 AS SELECT 1 AS a, 1 AS b;
|
||||||
|
CREATE TABLE t2 AS SELECT 1 AS a, 1 AS b;
|
||||||
|
CREATE PROCEDURE p1()
|
||||||
|
BEGIN
|
||||||
|
UPDATE t1 JOIN t2 USING( a, b ) SET t1.b = 1, t2.b = 1;
|
||||||
|
END|
|
||||||
|
LOCK TABLES t1 WRITE, t2 WRITE;
|
||||||
|
SET DEBUG_SYNC = 'multi_update_reopen_tables SIGNAL parked WAIT_FOR go';
|
||||||
|
CALL p1();
|
||||||
|
DROP TABLE t1, t2;
|
||||||
|
SET DEBUG_SYNC = 'now WAIT_FOR parked';
|
||||||
|
CREATE TABLE t1 AS SELECT 1 AS a, 1 AS b;
|
||||||
|
CREATE TABLE t2 AS SELECT 1 AS a, 1 AS b;
|
||||||
|
SET DEBUG_SYNC = 'now SIGNAL go';
|
||||||
|
# Without the DEBUG_SYNC supplied in the same patch as this test in the
|
||||||
|
# code, this test statement will hang.
|
||||||
|
DROP TABLE t1, t2;
|
||||||
|
DROP PROCEDURE p1;
|
||||||
|
SET DEBUG_SYNC = 'RESET';
|
@ -1584,3 +1584,63 @@ SELECT ( SELECT a UNION SELECT a ) INTO @v FROM t1;
|
|||||||
SELECT ( SELECT a UNION SELECT a ) INTO OUTFILE 'union.out.file3' FROM t1;
|
SELECT ( SELECT a UNION SELECT a ) INTO OUTFILE 'union.out.file3' FROM t1;
|
||||||
SELECT ( SELECT a UNION SELECT a ) INTO DUMPFILE 'union.out.file4' FROM t1;
|
SELECT ( SELECT a UNION SELECT a ) INTO DUMPFILE 'union.out.file4' FROM t1;
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
|
#
|
||||||
|
# Bug #49734: Crash on EXPLAIN EXTENDED UNION ... ORDER BY
|
||||||
|
# <any non-const-function>
|
||||||
|
#
|
||||||
|
CREATE TABLE t1 (a VARCHAR(10), FULLTEXT KEY a (a));
|
||||||
|
INSERT INTO t1 VALUES (1),(2);
|
||||||
|
CREATE TABLE t2 (b INT);
|
||||||
|
INSERT INTO t2 VALUES (1),(2);
|
||||||
|
# Should not crash
|
||||||
|
EXPLAIN EXTENDED
|
||||||
|
SELECT * FROM t1 UNION SELECT * FROM t1 ORDER BY a + 12;
|
||||||
|
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||||
|
1 PRIMARY t1 ALL NULL NULL NULL NULL 2 100.00
|
||||||
|
2 UNION t1 ALL NULL NULL NULL NULL 2 100.00
|
||||||
|
NULL UNION RESULT <union1,2> ALL NULL NULL NULL NULL NULL NULL Using filesort
|
||||||
|
Warnings:
|
||||||
|
Note 1003 select `test`.`t1`.`a` AS `a` from `test`.`t1` union select `test`.`t1`.`a` AS `a` from `test`.`t1` order by (`a` + 12)
|
||||||
|
# Should not crash
|
||||||
|
SELECT * FROM t1 UNION SELECT * FROM t1 ORDER BY a + 12;
|
||||||
|
a
|
||||||
|
1
|
||||||
|
2
|
||||||
|
# Should not crash
|
||||||
|
EXPLAIN EXTENDED
|
||||||
|
SELECT * FROM t1 UNION SELECT * FROM t1
|
||||||
|
ORDER BY MATCH(a) AGAINST ('+abc' IN BOOLEAN MODE);
|
||||||
|
ERROR 42000: Incorrect usage/placement of 'MATCH()'
|
||||||
|
# Should not crash
|
||||||
|
SELECT * FROM t1 UNION SELECT * FROM t1
|
||||||
|
ORDER BY MATCH(a) AGAINST ('+abc' IN BOOLEAN MODE);
|
||||||
|
ERROR 42000: Incorrect usage/placement of 'MATCH()'
|
||||||
|
# Should not crash
|
||||||
|
(SELECT * FROM t1) UNION (SELECT * FROM t1)
|
||||||
|
ORDER BY MATCH(a) AGAINST ('+abc' IN BOOLEAN MODE);
|
||||||
|
a
|
||||||
|
1
|
||||||
|
2
|
||||||
|
# Should not crash
|
||||||
|
EXPLAIN EXTENDED
|
||||||
|
SELECT * FROM t1 UNION SELECT * FROM t1
|
||||||
|
ORDER BY (SELECT a FROM t2 WHERE b = 12);
|
||||||
|
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||||
|
1 PRIMARY t1 ALL NULL NULL NULL NULL 2 100.00
|
||||||
|
2 UNION t1 ALL NULL NULL NULL NULL 2 100.00
|
||||||
|
3 SUBQUERY t2 ALL NULL NULL NULL NULL 2 100.00 Using where
|
||||||
|
NULL UNION RESULT <union1,2> ALL NULL NULL NULL NULL NULL NULL Using filesort
|
||||||
|
Warnings:
|
||||||
|
Note 1276 Field or reference 'test.t1.a' of SELECT #3 was resolved in SELECT #2
|
||||||
|
Note 1003 select `test`.`t1`.`a` AS `a` from `test`.`t1` union select `test`.`t1`.`a` AS `a` from `test`.`t1` order by (select `test`.`t1`.`a` AS `a` from `test`.`t2` where (`test`.`t2`.`b` = 12))
|
||||||
|
# Should not crash
|
||||||
|
SELECT * FROM t1 UNION SELECT * FROM t1
|
||||||
|
ORDER BY (SELECT a FROM t2 WHERE b = 12);
|
||||||
|
# Should not crash
|
||||||
|
SELECT * FROM t2 UNION SELECT * FROM t2
|
||||||
|
ORDER BY (SELECT * FROM t1 WHERE MATCH(a) AGAINST ('+abc' IN BOOLEAN MODE));
|
||||||
|
b
|
||||||
|
1
|
||||||
|
2
|
||||||
|
DROP TABLE t1,t2;
|
||||||
|
End of 5.1 tests
|
||||||
|
@ -407,6 +407,21 @@ SELECT a, b FROM t1 WHERE a=2 AND b=3 GROUP BY a, b;
|
|||||||
a b
|
a b
|
||||||
2 3
|
2 3
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
|
CREATE TABLE t1 (f1 int(11) default NULL, f2 int(11) default NULL);
|
||||||
|
CREATE TABLE t2 (f1 int(11) default NULL, f2 int(11) default NULL, foo int(11));
|
||||||
|
CREATE TABLE t3 (f1 int(11) default NULL, f2 int(11) default NULL);
|
||||||
|
INSERT INTO t1 VALUES(10, 10);
|
||||||
|
INSERT INTO t1 VALUES(10, 10);
|
||||||
|
INSERT INTO t2 VALUES(10, 10, 10);
|
||||||
|
INSERT INTO t2 VALUES(10, 10, 10);
|
||||||
|
INSERT INTO t3 VALUES(10, 10);
|
||||||
|
INSERT INTO t3 VALUES(10, 10);
|
||||||
|
SELECT MIN(t2.f1),
|
||||||
|
@bar:= (SELECT MIN(t3.f2) FROM t3 WHERE t3.f2 > foo)
|
||||||
|
FROM t1,t2 WHERE t1.f1 = t2.f1 ORDER BY t2.f1;
|
||||||
|
MIN(t2.f1) @bar:= (SELECT MIN(t3.f2) FROM t3 WHERE t3.f2 > foo)
|
||||||
|
10 NULL
|
||||||
|
DROP TABLE t1, t2, t3;
|
||||||
End of 5.0 tests
|
End of 5.0 tests
|
||||||
CREATE TABLE t1 (i INT);
|
CREATE TABLE t1 (i INT);
|
||||||
CREATE TRIGGER t_after_insert AFTER INSERT ON t1 FOR EACH ROW SET @bug42188 = 10;
|
CREATE TRIGGER t_after_insert AFTER INSERT ON t1 FOR EACH ROW SET @bug42188 = 10;
|
||||||
|
@ -20,7 +20,7 @@ show binlog events from <binlog_start>;
|
|||||||
Log_name Pos Event_type Server_id End_log_pos Info
|
Log_name Pos Event_type Server_id End_log_pos Info
|
||||||
master-bin.000001 # Query # # BEGIN
|
master-bin.000001 # Query # # BEGIN
|
||||||
master-bin.000001 # Begin_load_query # # ;file_id=#;block_len=#
|
master-bin.000001 # Begin_load_query # # ;file_id=#;block_len=#
|
||||||
master-bin.000001 # Execute_load_query # # use `test`; LOAD DATA INFILE '../../std_data/rpl_loaddata.dat' INTO TABLE `t2` FIELDS TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY '\\' LINES TERMINATED BY '\n' (a, b) ;file_id=#
|
master-bin.000001 # Execute_load_query # # use `test`; LOAD DATA INFILE '../../std_data/rpl_loaddata.dat' INTO TABLE `t2` FIELDS TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY '\\' LINES TERMINATED BY '\n' (`a`, `b`) ;file_id=#
|
||||||
master-bin.000001 # Query # # COMMIT
|
master-bin.000001 # Query # # COMMIT
|
||||||
select
|
select
|
||||||
(@a:=load_file("MYSQLTEST_VARDIR/tmp/binlog_killed_bug27571.binlog"))
|
(@a:=load_file("MYSQLTEST_VARDIR/tmp/binlog_killed_bug27571.binlog"))
|
||||||
|
@ -128,7 +128,7 @@ master-bin.000001 # Query # # COMMIT
|
|||||||
master-bin.000001 # Query # # use `test`; create table t2 (a varchar(200)) engine=blackhole
|
master-bin.000001 # Query # # use `test`; create table t2 (a varchar(200)) engine=blackhole
|
||||||
master-bin.000001 # Query # # BEGIN
|
master-bin.000001 # Query # # BEGIN
|
||||||
master-bin.000001 # Begin_load_query # # ;file_id=#;block_len=581
|
master-bin.000001 # Begin_load_query # # ;file_id=#;block_len=581
|
||||||
master-bin.000001 # Execute_load_query # # use `test`; LOAD DATA INFILE '../../std_data/words.dat' INTO TABLE `t2` FIELDS TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY '\\' LINES TERMINATED BY '\n' (a) ;file_id=#
|
master-bin.000001 # Execute_load_query # # use `test`; LOAD DATA INFILE '../../std_data/words.dat' INTO TABLE `t2` FIELDS TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY '\\' LINES TERMINATED BY '\n' (`a`) ;file_id=#
|
||||||
master-bin.000001 # Query # # COMMIT
|
master-bin.000001 # Query # # COMMIT
|
||||||
master-bin.000001 # Query # # use `test`; alter table t1 add b int
|
master-bin.000001 # Query # # use `test`; alter table t1 add b int
|
||||||
master-bin.000001 # Query # # use `test`; alter table t1 drop b
|
master-bin.000001 # Query # # use `test`; alter table t1 drop b
|
||||||
|
@ -701,7 +701,7 @@ master-bin.000001 # Query # # BEGIN
|
|||||||
master-bin.000001 # Intvar # # INSERT_ID=10
|
master-bin.000001 # Intvar # # INSERT_ID=10
|
||||||
master-bin.000001 # Begin_load_query # # ;file_id=#;block_len=#
|
master-bin.000001 # Begin_load_query # # ;file_id=#;block_len=#
|
||||||
master-bin.000001 # Intvar # # INSERT_ID=10
|
master-bin.000001 # Intvar # # INSERT_ID=10
|
||||||
master-bin.000001 # Execute_load_query # # use `test`; LOAD DATA INFILE '../../std_data/rpl_loaddata.dat' INTO TABLE `t4` FIELDS TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY '\\' LINES TERMINATED BY '\n' (a, @b) SET b=((@b) + `bug27417`(2)) ;file_id=#
|
master-bin.000001 # Execute_load_query # # use `test`; LOAD DATA INFILE '../../std_data/rpl_loaddata.dat' INTO TABLE `t4` FIELDS TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY '\\' LINES TERMINATED BY '\n' (`a`, @b) SET `b`=((@b) + `bug27417`(2)) ;file_id=#
|
||||||
master-bin.000001 # Query # # ROLLBACK
|
master-bin.000001 # Query # # ROLLBACK
|
||||||
/* the output must denote there is the query */;
|
/* the output must denote there is the query */;
|
||||||
drop trigger trg_del_t2;
|
drop trigger trg_del_t2;
|
||||||
@ -959,7 +959,7 @@ master-bin.000001 # User var # # @`b`=_latin1 0x3135 COLLATE latin1_swedish_ci
|
|||||||
master-bin.000001 # Begin_load_query # # ;file_id=#;block_len=#
|
master-bin.000001 # Begin_load_query # # ;file_id=#;block_len=#
|
||||||
master-bin.000001 # Intvar # # INSERT_ID=10
|
master-bin.000001 # Intvar # # INSERT_ID=10
|
||||||
master-bin.000001 # User var # # @`b`=_latin1 0x3135 COLLATE latin1_swedish_ci
|
master-bin.000001 # User var # # @`b`=_latin1 0x3135 COLLATE latin1_swedish_ci
|
||||||
master-bin.000001 # Execute_load_query # # use `test`; LOAD DATA INFILE '../../std_data/rpl_loaddata.dat' INTO TABLE `t4` FIELDS TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY '\\' LINES TERMINATED BY '\n' (a, @b) SET b=((@b) + `bug27417`(2)) ;file_id=#
|
master-bin.000001 # Execute_load_query # # use `test`; LOAD DATA INFILE '../../std_data/rpl_loaddata.dat' INTO TABLE `t4` FIELDS TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY '\\' LINES TERMINATED BY '\n' (`a`, @b) SET `b`=((@b) + `bug27417`(2)) ;file_id=#
|
||||||
master-bin.000001 # Query # # ROLLBACK
|
master-bin.000001 # Query # # ROLLBACK
|
||||||
drop trigger trg_del_t2;
|
drop trigger trg_del_t2;
|
||||||
drop table t1,t2,t3,t4,t5;
|
drop table t1,t2,t3,t4,t5;
|
||||||
|
@ -3240,7 +3240,10 @@ Warnings:
|
|||||||
Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Reason for unsafeness: Statement uses a system function whose value may differ on slave.
|
Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Reason for unsafeness: Statement uses a system function whose value may differ on slave.
|
||||||
INSERT INTO t1 VALUES (VERSION());
|
INSERT INTO t1 VALUES (VERSION());
|
||||||
Warnings:
|
Warnings:
|
||||||
Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Reason for unsafeness: Statement uses a system function whose value may differ on slave.
|
Note 1592 Statement may not be safe to log in statement format.
|
||||||
|
INSERT INTO t1 VALUES (RAND());
|
||||||
|
Warnings:
|
||||||
|
Note 1592 Statement may not be safe to log in statement format.
|
||||||
DELETE FROM t1;
|
DELETE FROM t1;
|
||||||
SET TIMESTAMP=1000000;
|
SET TIMESTAMP=1000000;
|
||||||
INSERT INTO t1 VALUES
|
INSERT INTO t1 VALUES
|
||||||
|
@ -77,7 +77,8 @@
|
|||||||
# BUG#42640: mysqld crashes when unsafe statements are executed (STRICT_TRANS_TABLES mode)
|
# BUG#42640: mysqld crashes when unsafe statements are executed (STRICT_TRANS_TABLES mode)
|
||||||
# BUG#45825: INSERT DELAYED is not unsafe: logged in statement format
|
# BUG#45825: INSERT DELAYED is not unsafe: logged in statement format
|
||||||
# BUG#45785: LIMIT in SP does not cause RBL if binlog_format=MIXED
|
# BUG#45785: LIMIT in SP does not cause RBL if binlog_format=MIXED
|
||||||
#
|
# BUG#47995: Mark user functions as unsafe
|
||||||
|
# BUG#49222: Mare RAND() unsafe
|
||||||
#
|
#
|
||||||
# ==== Related test cases ====
|
# ==== Related test cases ====
|
||||||
#
|
#
|
||||||
@ -646,6 +647,7 @@ DROP TABLE t1,t2,t3;
|
|||||||
|
|
||||||
#
|
#
|
||||||
# BUG#47995: Mark user functions as unsafe
|
# BUG#47995: Mark user functions as unsafe
|
||||||
|
# BUG#49222: Mare RAND() unsafe
|
||||||
#
|
#
|
||||||
# Test that the system functions that are supposed to be marked unsafe
|
# Test that the system functions that are supposed to be marked unsafe
|
||||||
# generate a warning. Each INSERT statement below should generate a
|
# generate a warning. Each INSERT statement below should generate a
|
||||||
@ -656,27 +658,28 @@ SET SESSION binlog_format = STATEMENT;
|
|||||||
CREATE TABLE t1 (a VARCHAR(1000));
|
CREATE TABLE t1 (a VARCHAR(1000));
|
||||||
INSERT INTO t1 VALUES (CURRENT_USER()); #marked unsafe before BUG#47995
|
INSERT INTO t1 VALUES (CURRENT_USER()); #marked unsafe before BUG#47995
|
||||||
INSERT INTO t1 VALUES (FOUND_ROWS()); #marked unsafe before BUG#47995
|
INSERT INTO t1 VALUES (FOUND_ROWS()); #marked unsafe before BUG#47995
|
||||||
INSERT INTO t1 VALUES (GET_LOCK('tmp', 1));
|
INSERT INTO t1 VALUES (GET_LOCK('tmp', 1)); #marked unsafe in BUG#47995
|
||||||
INSERT INTO t1 VALUES (IS_FREE_LOCK('tmp'));
|
INSERT INTO t1 VALUES (IS_FREE_LOCK('tmp')); #marked unsafe in BUG#47995
|
||||||
INSERT INTO t1 VALUES (IS_USED_LOCK('tmp'));
|
INSERT INTO t1 VALUES (IS_USED_LOCK('tmp')); #marked unsafe in BUG#47995
|
||||||
INSERT INTO t1 VALUES (LOAD_FILE('../../std_data/words2.dat')); #marked unsafe before BUG#47995
|
INSERT INTO t1 VALUES (LOAD_FILE('../../std_data/words2.dat')); #marked unsafe in BUG#39701
|
||||||
INSERT INTO t1 VALUES (MASTER_POS_WAIT('dummy arg', 4711, 1));
|
INSERT INTO t1 VALUES (MASTER_POS_WAIT('dummy arg', 4711, 1));
|
||||||
INSERT INTO t1 VALUES (RELEASE_LOCK('tmp'));
|
INSERT INTO t1 VALUES (RELEASE_LOCK('tmp')); #marked unsafe in BUG#47995
|
||||||
INSERT INTO t1 VALUES (ROW_COUNT()); #marked unsafe before BUG#47995
|
INSERT INTO t1 VALUES (ROW_COUNT()); #marked unsafe before BUG#47995
|
||||||
INSERT INTO t1 VALUES (SESSION_USER()); #marked unsafe before BUG#47995
|
INSERT INTO t1 VALUES (SESSION_USER()); #marked unsafe before BUG#47995
|
||||||
INSERT INTO t1 VALUES (SLEEP(1));
|
INSERT INTO t1 VALUES (SLEEP(1)); #marked unsafe in BUG#47995
|
||||||
INSERT INTO t1 VALUES (SYSDATE());
|
INSERT INTO t1 VALUES (SYSDATE()); #marked unsafe in BUG#47995
|
||||||
INSERT INTO t1 VALUES (SYSTEM_USER()); #marked unsafe before BUG#47995
|
INSERT INTO t1 VALUES (SYSTEM_USER()); #marked unsafe before BUG#47995
|
||||||
INSERT INTO t1 VALUES (USER()); #marked unsafe before BUG#47995
|
INSERT INTO t1 VALUES (USER()); #marked unsafe before BUG#47995
|
||||||
INSERT INTO t1 VALUES (UUID()); #marked unsafe before BUG#47995
|
INSERT INTO t1 VALUES (UUID()); #marked unsafe before BUG#47995
|
||||||
INSERT INTO t1 VALUES (UUID_SHORT()); #marked unsafe before BUG#47995
|
INSERT INTO t1 VALUES (UUID_SHORT()); #marked unsafe before BUG#47995
|
||||||
INSERT INTO t1 VALUES (VERSION());
|
INSERT INTO t1 VALUES (VERSION()); #marked unsafe in BUG#47995
|
||||||
|
INSERT INTO t1 VALUES (RAND()); #marked unsafe in BUG#49222
|
||||||
DELETE FROM t1;
|
DELETE FROM t1;
|
||||||
|
|
||||||
# Since we replicate the TIMESTAMP variable, functions affected by the
|
# Since we replicate the TIMESTAMP variable, functions affected by the
|
||||||
# TIMESTAMP variable are safe to replicate. So we check that the
|
# TIMESTAMP variable are safe to replicate. So we check that the
|
||||||
# following following functions depend on the TIMESTAMP variable and
|
# following following functions that depend on the TIMESTAMP variable
|
||||||
# don't generate a warning.
|
# are not unsafe and don't generate a warning.
|
||||||
|
|
||||||
SET TIMESTAMP=1000000;
|
SET TIMESTAMP=1000000;
|
||||||
INSERT INTO t1 VALUES
|
INSERT INTO t1 VALUES
|
||||||
|
@ -12,3 +12,17 @@ show status like 'Slave_open_temp_tables';
|
|||||||
Variable_name Value
|
Variable_name Value
|
||||||
Slave_open_temp_tables 0
|
Slave_open_temp_tables 0
|
||||||
drop database mysqltest;
|
drop database mysqltest;
|
||||||
|
DROP TEMPORARY TABLE IF EXISTS tmp1;
|
||||||
|
Warnings:
|
||||||
|
Note 1051 Unknown table 'tmp1'
|
||||||
|
CREATE TEMPORARY TABLE t1 ( a int );
|
||||||
|
DROP TEMPORARY TABLE t1, t2;
|
||||||
|
ERROR 42S02: Unknown table 't2'
|
||||||
|
DROP TEMPORARY TABLE tmp2;
|
||||||
|
ERROR 42S02: Unknown table 'tmp2'
|
||||||
|
stop slave;
|
||||||
|
**** On Master ****
|
||||||
|
CREATE TEMPORARY TABLE tmp3 (a int);
|
||||||
|
DROP TEMPORARY TABLE tmp3;
|
||||||
|
SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
|
||||||
|
START SLAVE;
|
||||||
|
18
mysql-test/suite/rpl/r/rpl_geometry.result
Normal file
18
mysql-test/suite/rpl/r/rpl_geometry.result
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
stop slave;
|
||||||
|
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
|
||||||
|
reset master;
|
||||||
|
reset slave;
|
||||||
|
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
|
||||||
|
start slave;
|
||||||
|
create table t1(a varchar(100),
|
||||||
|
b multipoint not null,
|
||||||
|
c varchar(256));
|
||||||
|
insert into t1 set
|
||||||
|
a='hello',
|
||||||
|
b=geomfromtext('multipoint(1 1)'),
|
||||||
|
c='geometry';
|
||||||
|
create table t2 (a int(11) not null auto_increment primary key,
|
||||||
|
b geometrycollection default null,
|
||||||
|
c decimal(10,0));
|
||||||
|
insert into t2(c) values (null);
|
||||||
|
drop table t1, t2;
|
@ -885,7 +885,7 @@ master-bin.000001 # Query 1 # use `test_rpl`; DELETE FROM t2
|
|||||||
master-bin.000001 # Xid 1 # #
|
master-bin.000001 # Xid 1 # #
|
||||||
master-bin.000001 # Query 1 # BEGIN
|
master-bin.000001 # Query 1 # BEGIN
|
||||||
master-bin.000001 # Begin_load_query 1 # ;file_id=#;block_len=#
|
master-bin.000001 # Begin_load_query 1 # ;file_id=#;block_len=#
|
||||||
master-bin.000001 # Execute_load_query 1 # use `test_rpl`; LOAD DATA INFILE 'MYSQLTEST_VARDIR/std_data/rpl_mixed.dat' INTO TABLE `t1` FIELDS TERMINATED BY '|' ENCLOSED BY '' ESCAPED BY '\\' LINES TERMINATED BY '\n' (a, b) ;file_id=#
|
master-bin.000001 # Execute_load_query 1 # use `test_rpl`; LOAD DATA INFILE 'MYSQLTEST_VARDIR/std_data/rpl_mixed.dat' INTO TABLE `t1` FIELDS TERMINATED BY '|' ENCLOSED BY '' ESCAPED BY '\\' LINES TERMINATED BY '\n' (`a`, `b`) ;file_id=#
|
||||||
master-bin.000001 # Xid 1 # #
|
master-bin.000001 # Xid 1 # #
|
||||||
master-bin.000001 # Query 1 # BEGIN
|
master-bin.000001 # Query 1 # BEGIN
|
||||||
master-bin.000001 # Query 1 # use `test_rpl`; DELETE FROM t1
|
master-bin.000001 # Query 1 # use `test_rpl`; DELETE FROM t1
|
||||||
|
@ -115,3 +115,20 @@ use b48297_db1;
|
|||||||
Comparing tables master:b48297_db1.t1 and slave:b48297_db1.t1
|
Comparing tables master:b48297_db1.t1 and slave:b48297_db1.t1
|
||||||
DROP DATABASE b48297_db1;
|
DROP DATABASE b48297_db1;
|
||||||
DROP DATABASE b42897_db2;
|
DROP DATABASE b42897_db2;
|
||||||
|
stop slave;
|
||||||
|
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
|
||||||
|
reset master;
|
||||||
|
reset slave;
|
||||||
|
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
|
||||||
|
start slave;
|
||||||
|
use test;
|
||||||
|
CREATE TABLE t1 (`key` TEXT, `text` TEXT);
|
||||||
|
LOAD DATA INFILE '../../std_data/loaddata2.dat' REPLACE INTO TABLE `t1` FIELDS TERMINATED BY ',';
|
||||||
|
SELECT * FROM t1;
|
||||||
|
key text
|
||||||
|
Field A 'Field B'
|
||||||
|
Field 1 'Field 2'
|
||||||
|
Field 3 'Field 4'
|
||||||
|
'Field 5' 'Field 6'
|
||||||
|
Field 6 'Field 7'
|
||||||
|
DROP TABLE t1;
|
||||||
|
@ -21,7 +21,7 @@ master-bin.000001 # Query # # BEGIN
|
|||||||
master-bin.000001 # Begin_load_query # # ;file_id=#;block_len=#
|
master-bin.000001 # Begin_load_query # # ;file_id=#;block_len=#
|
||||||
master-bin.000001 # Append_block # # ;file_id=#;block_len=#
|
master-bin.000001 # Append_block # # ;file_id=#;block_len=#
|
||||||
master-bin.000001 # Append_block # # ;file_id=#;block_len=#
|
master-bin.000001 # Append_block # # ;file_id=#;block_len=#
|
||||||
master-bin.000001 # Execute_load_query # # use `test`; LOAD DATA INFILE 'MYSQLTEST_VARDIR/tmp/bug30435_5k.txt' INTO TABLE `t2` FIELDS TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY '\\' LINES TERMINATED BY '\n' (id) ;file_id=#
|
master-bin.000001 # Execute_load_query # # use `test`; LOAD DATA INFILE 'MYSQLTEST_VARDIR/tmp/bug30435_5k.txt' INTO TABLE `t2` FIELDS TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY '\\' LINES TERMINATED BY '\n' (`id`) ;file_id=#
|
||||||
master-bin.000001 # Query # # COMMIT
|
master-bin.000001 # Query # # COMMIT
|
||||||
==== Verify results on slave ====
|
==== Verify results on slave ====
|
||||||
[on slave]
|
[on slave]
|
||||||
|
25
mysql-test/suite/rpl/r/rpl_manual_change_index_file.result
Normal file
25
mysql-test/suite/rpl/r/rpl_manual_change_index_file.result
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
stop slave;
|
||||||
|
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
|
||||||
|
reset master;
|
||||||
|
reset slave;
|
||||||
|
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
|
||||||
|
start slave;
|
||||||
|
FLUSH LOGS;
|
||||||
|
CREATE TABLE t1(c1 INT);
|
||||||
|
FLUSH LOGS;
|
||||||
|
call mtr.add_suppression('Got fatal error 1236 from master when reading data from binary log: .*could not find next log');
|
||||||
|
Last_IO_Error
|
||||||
|
Got fatal error 1236 from master when reading data from binary log: 'could not find next log'
|
||||||
|
CREATE TABLE t2(c1 INT);
|
||||||
|
FLUSH LOGS;
|
||||||
|
CREATE TABLE t3(c1 INT);
|
||||||
|
FLUSH LOGS;
|
||||||
|
CREATE TABLE t4(c1 INT);
|
||||||
|
START SLAVE IO_THREAD;
|
||||||
|
SHOW TABLES;
|
||||||
|
Tables_in_test
|
||||||
|
t1
|
||||||
|
t2
|
||||||
|
t3
|
||||||
|
t4
|
||||||
|
DROP TABLE t1, t2, t3, t4;
|
@ -4,6 +4,7 @@ reset master;
|
|||||||
reset slave;
|
reset slave;
|
||||||
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
|
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
|
||||||
start slave;
|
start slave;
|
||||||
|
CALL mtr.add_suppression('Statement may not be safe to log in statement format.');
|
||||||
create table t1(id int, i int, r1 int, r2 int, p varchar(100));
|
create table t1(id int, i int, r1 int, r2 int, p varchar(100));
|
||||||
insert into t1 values(1, connection_id(), 0, 0, "");
|
insert into t1 values(1, connection_id(), 0, 0, "");
|
||||||
insert into t1 values(2, 0, rand()*1000, rand()*1000, "");
|
insert into t1 values(2, 0, rand()*1000, rand()*1000, "");
|
||||||
|
24
mysql-test/suite/rpl/r/rpl_myisam_null_values.result
Normal file
24
mysql-test/suite/rpl/r/rpl_myisam_null_values.result
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
stop slave;
|
||||||
|
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
|
||||||
|
reset master;
|
||||||
|
reset slave;
|
||||||
|
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
|
||||||
|
start slave;
|
||||||
|
CREATE TABLE t1 (c1 BIT, c2 INT);
|
||||||
|
INSERT INTO `t1` VALUES ( 1, 1 );
|
||||||
|
UPDATE t1 SET c1=NULL where c2=1;
|
||||||
|
Comparing tables master:test.t1 and slave:test.t1
|
||||||
|
DELETE FROM t1 WHERE c2=1 LIMIT 1;
|
||||||
|
Comparing tables master:test.t1 and slave:test.t1
|
||||||
|
DROP TABLE t1;
|
||||||
|
CREATE TABLE t1 (c1 CHAR);
|
||||||
|
INSERT INTO t1 ( c1 ) VALUES ( 'w' ) ;
|
||||||
|
SELECT * FROM t1;
|
||||||
|
c1
|
||||||
|
w
|
||||||
|
# should trigger switch to row due to LIMIT
|
||||||
|
UPDATE t1 SET c1=NULL WHERE c1='w' LIMIT 2;
|
||||||
|
Comparing tables master:test.t1 and slave:test.t1
|
||||||
|
DELETE FROM t1 LIMIT 2;
|
||||||
|
Comparing tables master:test.t1 and slave:test.t1
|
||||||
|
DROP TABLE t1;
|
@ -4,6 +4,7 @@ reset master;
|
|||||||
reset slave;
|
reset slave;
|
||||||
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
|
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
|
||||||
start slave;
|
start slave;
|
||||||
|
CALL mtr.add_suppression('Statement may not be safe to log in statement format.');
|
||||||
CREATE TABLE t1 (a VARCHAR(1000));
|
CREATE TABLE t1 (a VARCHAR(1000));
|
||||||
INSERT INTO t1 VALUES (CONNECTION_ID());
|
INSERT INTO t1 VALUES (CONNECTION_ID());
|
||||||
INSERT INTO t1 VALUES (CONNECTION_ID());
|
INSERT INTO t1 VALUES (CONNECTION_ID());
|
||||||
|
@ -4,6 +4,7 @@ reset master;
|
|||||||
reset slave;
|
reset slave;
|
||||||
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
|
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
|
||||||
start slave;
|
start slave;
|
||||||
|
CALL mtr.add_suppression('Statement may not be safe to log in statement format.');
|
||||||
DROP FUNCTION IF EXISTS test.f1;
|
DROP FUNCTION IF EXISTS test.f1;
|
||||||
DROP TABLE IF EXISTS test.t1;
|
DROP TABLE IF EXISTS test.t1;
|
||||||
CREATE TABLE test.t1 (a INT NOT NULL AUTO_INCREMENT, c CHAR(16),PRIMARY KEY(a))ENGINE=INNODB;
|
CREATE TABLE test.t1 (a INT NOT NULL AUTO_INCREMENT, c CHAR(16),PRIMARY KEY(a))ENGINE=INNODB;
|
||||||
|
@ -1,5 +1,11 @@
|
|||||||
RESET MASTER;
|
stop slave;
|
||||||
|
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
|
||||||
|
reset master;
|
||||||
|
reset slave;
|
||||||
|
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
|
||||||
|
start slave;
|
||||||
DROP TABLE IF EXISTS `t1`;
|
DROP TABLE IF EXISTS `t1`;
|
||||||
|
### TABLE with field_metadata_size == 290
|
||||||
CREATE TABLE `t1` (
|
CREATE TABLE `t1` (
|
||||||
`c1` int(11) NOT NULL AUTO_INCREMENT,
|
`c1` int(11) NOT NULL AUTO_INCREMENT,
|
||||||
`c2` varchar(30) NOT NULL,
|
`c2` varchar(30) NOT NULL,
|
||||||
@ -150,7 +156,51 @@ CREATE TABLE `t1` (
|
|||||||
PRIMARY KEY (`c1`)
|
PRIMARY KEY (`c1`)
|
||||||
) ENGINE=InnoDB;
|
) ENGINE=InnoDB;
|
||||||
LOCK TABLES `t1` WRITE;
|
LOCK TABLES `t1` WRITE;
|
||||||
INSERT INTO `t1` VALUES ('1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1');
|
INSERT INTO `t1`(c2) VALUES ('1');
|
||||||
DROP TABLE `t1`;
|
|
||||||
FLUSH LOGS;
|
FLUSH LOGS;
|
||||||
|
### assertion: the slave replicated event successfully and tables match
|
||||||
|
Comparing tables master:test.t1 and slave:test.t1
|
||||||
|
DROP TABLE `t1`;
|
||||||
=== Using mysqlbinlog to detect failure. Before the patch mysqlbinlog would find a corrupted event, thence would fail.
|
=== Using mysqlbinlog to detect failure. Before the patch mysqlbinlog would find a corrupted event, thence would fail.
|
||||||
|
stop slave;
|
||||||
|
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
|
||||||
|
reset master;
|
||||||
|
reset slave;
|
||||||
|
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
|
||||||
|
start slave;
|
||||||
|
### action: generating several tables with different metadata
|
||||||
|
### sizes (resorting to perl)
|
||||||
|
### testing table with 249 field metadata size.
|
||||||
|
### testing table with 250 field metadata size.
|
||||||
|
### testing table with 251 field metadata size.
|
||||||
|
### testing table with 252 field metadata size.
|
||||||
|
### testing table with 253 field metadata size.
|
||||||
|
### testing table with 254 field metadata size.
|
||||||
|
### testing table with 255 field metadata size.
|
||||||
|
### testing table with 256 field metadata size.
|
||||||
|
### testing table with 257 field metadata size.
|
||||||
|
### testing table with 258 field metadata size.
|
||||||
|
FLUSH LOGS;
|
||||||
|
### assertion: the slave replicated event successfully and tables match for t10
|
||||||
|
Comparing tables master:test.t10 and slave:test.t10
|
||||||
|
### assertion: the slave replicated event successfully and tables match for t9
|
||||||
|
Comparing tables master:test.t9 and slave:test.t9
|
||||||
|
### assertion: the slave replicated event successfully and tables match for t8
|
||||||
|
Comparing tables master:test.t8 and slave:test.t8
|
||||||
|
### assertion: the slave replicated event successfully and tables match for t7
|
||||||
|
Comparing tables master:test.t7 and slave:test.t7
|
||||||
|
### assertion: the slave replicated event successfully and tables match for t6
|
||||||
|
Comparing tables master:test.t6 and slave:test.t6
|
||||||
|
### assertion: the slave replicated event successfully and tables match for t5
|
||||||
|
Comparing tables master:test.t5 and slave:test.t5
|
||||||
|
### assertion: the slave replicated event successfully and tables match for t4
|
||||||
|
Comparing tables master:test.t4 and slave:test.t4
|
||||||
|
### assertion: the slave replicated event successfully and tables match for t3
|
||||||
|
Comparing tables master:test.t3 and slave:test.t3
|
||||||
|
### assertion: the slave replicated event successfully and tables match for t2
|
||||||
|
Comparing tables master:test.t2 and slave:test.t2
|
||||||
|
### assertion: the slave replicated event successfully and tables match for t1
|
||||||
|
Comparing tables master:test.t1 and slave:test.t1
|
||||||
|
### assertion: check that binlog is not corrupt. Using mysqlbinlog to
|
||||||
|
### detect failure. Before the patch mysqlbinlog would find
|
||||||
|
### a corrupted event, thence would fail.
|
@ -7,11 +7,11 @@ Log_name Pos Event_type Server_id End_log_pos Info
|
|||||||
master-bin.000001 # Query # # use `test`; CREATE TABLE t1 (c1 char(50))
|
master-bin.000001 # Query # # use `test`; CREATE TABLE t1 (c1 char(50))
|
||||||
master-bin.000001 # Query # # BEGIN
|
master-bin.000001 # Query # # BEGIN
|
||||||
master-bin.000001 # Begin_load_query # # ;file_id=#;block_len=#
|
master-bin.000001 # Begin_load_query # # ;file_id=#;block_len=#
|
||||||
master-bin.000001 # Execute_load_query # # use `test`; LOAD DATA INFILE '../../std_data/words.dat' INTO TABLE `t1` FIELDS TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY '\\' LINES TERMINATED BY '\n' (c1) ;file_id=#
|
master-bin.000001 # Execute_load_query # # use `test`; LOAD DATA INFILE '../../std_data/words.dat' INTO TABLE `t1` FIELDS TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY '\\' LINES TERMINATED BY '\n' (`c1`) ;file_id=#
|
||||||
master-bin.000001 # Query # # COMMIT
|
master-bin.000001 # Query # # COMMIT
|
||||||
master-bin.000001 # Query # # BEGIN
|
master-bin.000001 # Query # # BEGIN
|
||||||
master-bin.000001 # Begin_load_query # # ;file_id=#;block_len=#
|
master-bin.000001 # Begin_load_query # # ;file_id=#;block_len=#
|
||||||
master-bin.000001 # Execute_load_query # # use `test`; LOAD DATA CONCURRENT INFILE '../../std_data/words.dat' INTO TABLE `t1` FIELDS TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY '\\' LINES TERMINATED BY '\n' (c1) ;file_id=#
|
master-bin.000001 # Execute_load_query # # use `test`; LOAD DATA CONCURRENT INFILE '../../std_data/words.dat' INTO TABLE `t1` FIELDS TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY '\\' LINES TERMINATED BY '\n' (`c1`) ;file_id=#
|
||||||
master-bin.000001 # Query # # COMMIT
|
master-bin.000001 # Query # # COMMIT
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
stop slave;
|
stop slave;
|
||||||
@ -131,3 +131,20 @@ use b48297_db1;
|
|||||||
Comparing tables master:b48297_db1.t1 and slave:b48297_db1.t1
|
Comparing tables master:b48297_db1.t1 and slave:b48297_db1.t1
|
||||||
DROP DATABASE b48297_db1;
|
DROP DATABASE b48297_db1;
|
||||||
DROP DATABASE b42897_db2;
|
DROP DATABASE b42897_db2;
|
||||||
|
stop slave;
|
||||||
|
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
|
||||||
|
reset master;
|
||||||
|
reset slave;
|
||||||
|
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
|
||||||
|
start slave;
|
||||||
|
use test;
|
||||||
|
CREATE TABLE t1 (`key` TEXT, `text` TEXT);
|
||||||
|
LOAD DATA INFILE '../../std_data/loaddata2.dat' REPLACE INTO TABLE `t1` FIELDS TERMINATED BY ',';
|
||||||
|
SELECT * FROM t1;
|
||||||
|
key text
|
||||||
|
Field A 'Field B'
|
||||||
|
Field 1 'Field 2'
|
||||||
|
Field 3 'Field 4'
|
||||||
|
'Field 5' 'Field 6'
|
||||||
|
Field 6 'Field 7'
|
||||||
|
DROP TABLE t1;
|
||||||
|
@ -28,7 +28,7 @@ master-bin.000001 # Query 1 # use `test`; drop table t1
|
|||||||
master-bin.000001 # Query 1 # use `test`; create table t1 (word char(20) not null)ENGINE=MyISAM
|
master-bin.000001 # Query 1 # use `test`; create table t1 (word char(20) not null)ENGINE=MyISAM
|
||||||
master-bin.000001 # Query 1 # BEGIN
|
master-bin.000001 # Query 1 # BEGIN
|
||||||
master-bin.000001 # Begin_load_query 1 # ;file_id=1;block_len=581
|
master-bin.000001 # Begin_load_query 1 # ;file_id=1;block_len=581
|
||||||
master-bin.000001 # Execute_load_query 1 # use `test`; LOAD DATA INFILE '../../std_data/words.dat' INTO TABLE `t1` FIELDS TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY '\\' LINES TERMINATED BY '\n' IGNORE 1 LINES (word) ;file_id=1
|
master-bin.000001 # Execute_load_query 1 # use `test`; LOAD DATA INFILE '../../std_data/words.dat' INTO TABLE `t1` FIELDS TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY '\\' LINES TERMINATED BY '\n' IGNORE 1 LINES (`word`) ;file_id=1
|
||||||
master-bin.000001 # Query 1 # COMMIT
|
master-bin.000001 # Query 1 # COMMIT
|
||||||
show binlog events from 107 limit 1;
|
show binlog events from 107 limit 1;
|
||||||
Log_name Pos Event_type Server_id End_log_pos Info
|
Log_name Pos Event_type Server_id End_log_pos Info
|
||||||
@ -203,7 +203,7 @@ master-bin.000001 # Query # # use `test`; drop table t1
|
|||||||
master-bin.000001 # Query # # use `test`; create table t1 (word char(20) not null)ENGINE=MyISAM
|
master-bin.000001 # Query # # use `test`; create table t1 (word char(20) not null)ENGINE=MyISAM
|
||||||
master-bin.000001 # Query # # BEGIN
|
master-bin.000001 # Query # # BEGIN
|
||||||
master-bin.000001 # Begin_load_query # # ;file_id=#;block_len=#
|
master-bin.000001 # Begin_load_query # # ;file_id=#;block_len=#
|
||||||
master-bin.000001 # Execute_load_query # # use `test`; LOAD DATA INFILE '../../std_data/words.dat' INTO TABLE `t1` FIELDS TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY '\\' LINES TERMINATED BY '\n' IGNORE 1 LINES (word) ;file_id=#
|
master-bin.000001 # Execute_load_query # # use `test`; LOAD DATA INFILE '../../std_data/words.dat' INTO TABLE `t1` FIELDS TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY '\\' LINES TERMINATED BY '\n' IGNORE 1 LINES (`word`) ;file_id=#
|
||||||
master-bin.000001 # Query # # COMMIT
|
master-bin.000001 # Query # # COMMIT
|
||||||
master-bin.000001 # Rotate # # master-bin.000002;pos=4
|
master-bin.000001 # Rotate # # master-bin.000002;pos=4
|
||||||
show binlog events in 'master-bin.000002';
|
show binlog events in 'master-bin.000002';
|
||||||
@ -234,7 +234,7 @@ slave-bin.000001 # Query 1 # use `test`; drop table t1
|
|||||||
slave-bin.000001 # Query 1 # use `test`; create table t1 (word char(20) not null)ENGINE=MyISAM
|
slave-bin.000001 # Query 1 # use `test`; create table t1 (word char(20) not null)ENGINE=MyISAM
|
||||||
slave-bin.000001 # Query 1 # BEGIN
|
slave-bin.000001 # Query 1 # BEGIN
|
||||||
slave-bin.000001 # Begin_load_query 1 # ;file_id=1;block_len=581
|
slave-bin.000001 # Begin_load_query 1 # ;file_id=1;block_len=581
|
||||||
slave-bin.000001 # Execute_load_query 1 # use `test`; LOAD DATA INFILE '../../tmp/SQL_LOAD-2-1-1.data' INTO TABLE `t1` FIELDS TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY '\\' LINES TERMINATED BY '\n' IGNORE 1 LINES (word) ;file_id=1
|
slave-bin.000001 # Execute_load_query 1 # use `test`; LOAD DATA INFILE '../../tmp/SQL_LOAD-2-1-1.data' INTO TABLE `t1` FIELDS TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY '\\' LINES TERMINATED BY '\n' IGNORE 1 LINES (`word`) ;file_id=1
|
||||||
slave-bin.000001 # Query 1 # COMMIT
|
slave-bin.000001 # Query 1 # COMMIT
|
||||||
slave-bin.000001 # Query 1 # use `test`; create table t3 (a int)ENGINE=MyISAM
|
slave-bin.000001 # Query 1 # use `test`; create table t3 (a int)ENGINE=MyISAM
|
||||||
slave-bin.000001 # Rotate 2 # slave-bin.000002;pos=4
|
slave-bin.000001 # Rotate 2 # slave-bin.000002;pos=4
|
||||||
|
@ -34,4 +34,36 @@ connection master;
|
|||||||
drop database mysqltest;
|
drop database mysqltest;
|
||||||
sync_slave_with_master;
|
sync_slave_with_master;
|
||||||
|
|
||||||
|
#
|
||||||
|
# Bug#49137
|
||||||
|
# This test verifies if DROP MULTI TEMPORARY TABLE
|
||||||
|
# will cause different errors on master and slave,
|
||||||
|
# when one or more of these tables do not exist.
|
||||||
|
#
|
||||||
|
|
||||||
|
connection master;
|
||||||
|
DROP TEMPORARY TABLE IF EXISTS tmp1;
|
||||||
|
CREATE TEMPORARY TABLE t1 ( a int );
|
||||||
|
--error 1051
|
||||||
|
DROP TEMPORARY TABLE t1, t2;
|
||||||
|
--error 1051
|
||||||
|
DROP TEMPORARY TABLE tmp2;
|
||||||
|
sync_slave_with_master;
|
||||||
|
|
||||||
|
connection slave;
|
||||||
|
stop slave;
|
||||||
|
wait_for_slave_to_stop;
|
||||||
|
|
||||||
|
--echo **** On Master ****
|
||||||
|
connection master;
|
||||||
|
CREATE TEMPORARY TABLE tmp3 (a int);
|
||||||
|
DROP TEMPORARY TABLE tmp3;
|
||||||
|
|
||||||
|
connection slave;
|
||||||
|
SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
|
||||||
|
START SLAVE;
|
||||||
|
|
||||||
|
connection master;
|
||||||
|
sync_slave_with_master;
|
||||||
|
|
||||||
# End of 4.1 tests
|
# End of 4.1 tests
|
||||||
|
26
mysql-test/suite/rpl/t/rpl_geometry.test
Normal file
26
mysql-test/suite/rpl/t/rpl_geometry.test
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
source include/master-slave.inc;
|
||||||
|
source include/have_binlog_format_row.inc;
|
||||||
|
|
||||||
|
#
|
||||||
|
# Bug#48776, Bug#43784
|
||||||
|
#
|
||||||
|
create table t1(a varchar(100),
|
||||||
|
b multipoint not null,
|
||||||
|
c varchar(256));
|
||||||
|
|
||||||
|
insert into t1 set
|
||||||
|
a='hello',
|
||||||
|
b=geomfromtext('multipoint(1 1)'),
|
||||||
|
c='geometry';
|
||||||
|
|
||||||
|
create table t2 (a int(11) not null auto_increment primary key,
|
||||||
|
b geometrycollection default null,
|
||||||
|
c decimal(10,0));
|
||||||
|
|
||||||
|
insert into t2(c) values (null);
|
||||||
|
|
||||||
|
sync_slave_with_master;
|
||||||
|
|
||||||
|
connection master;
|
||||||
|
drop table t1, t2;
|
||||||
|
source include/master-slave-end.inc;
|
106
mysql-test/suite/rpl/t/rpl_manual_change_index_file.test
Normal file
106
mysql-test/suite/rpl/t/rpl_manual_change_index_file.test
Normal file
@ -0,0 +1,106 @@
|
|||||||
|
source include/master-slave.inc;
|
||||||
|
|
||||||
|
#
|
||||||
|
# BUG#28421 Infinite loop on slave relay logs
|
||||||
|
#
|
||||||
|
# That, manually deleteing one or more entries from 'master-bin.index', will
|
||||||
|
# cause master infinitely loop to send one binlog file.
|
||||||
|
#
|
||||||
|
# Manually changing index file is a illegal action, so when this happen, we
|
||||||
|
# send a fatal error to slave and close the dump session.
|
||||||
|
|
||||||
|
FLUSH LOGS;
|
||||||
|
# Now, 2 entries in index file.
|
||||||
|
# ./master-bin.000001
|
||||||
|
# ./master-bin.000002
|
||||||
|
|
||||||
|
CREATE TABLE t1(c1 INT);
|
||||||
|
# Now, the current dump file(master-bin.000002) is the second line of index
|
||||||
|
# file
|
||||||
|
sync_slave_with_master;
|
||||||
|
# Now, all events has been replicate to slave. As current dump file
|
||||||
|
# (master-bin.000002) is the last binlog file, so master is waiting for new
|
||||||
|
# events.
|
||||||
|
|
||||||
|
connection master;
|
||||||
|
# Delete './master-bin.000001' from index file.
|
||||||
|
let $MYSQLD_DATADIR= `SELECT @@DATADIR`;
|
||||||
|
let $file= $MYSQLD_DATADIR/master-bin.index;
|
||||||
|
source include/truncate_file.inc;
|
||||||
|
|
||||||
|
if (`SELECT CONVERT(@@VERSION_COMPILE_OS USING latin1) NOT IN ('Win32', 'Win64', 'Windows')`)
|
||||||
|
{
|
||||||
|
append_file $MYSQLD_DATADIR/master-bin.index;
|
||||||
|
./master-bin.000002
|
||||||
|
EOF
|
||||||
|
sleep 0.00000001;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (`SELECT CONVERT(@@VERSION_COMPILE_OS USING latin1) IN ('Win32', 'Win64', 'Windows')`)
|
||||||
|
{
|
||||||
|
append_file $MYSQLD_DATADIR/master-bin.index;
|
||||||
|
.\master-bin.000002
|
||||||
|
EOF
|
||||||
|
sleep 0.00000001;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Now, only 1 entry in index file. ./master-bin.000002
|
||||||
|
|
||||||
|
# Generate master-bin.000003, but it is in the second line.
|
||||||
|
FLUSH LOGS;
|
||||||
|
# Now, 2 entries in index file.
|
||||||
|
# ./master-bin.000002
|
||||||
|
# ./master-bin.000003
|
||||||
|
|
||||||
|
# Now, master know that new binlog file(master-bin.000003) has been generated.
|
||||||
|
# It expects that the new binlog file is in third line of index file, but
|
||||||
|
# there is no third line in index file. It is so strange that master sends an
|
||||||
|
# error to slave.
|
||||||
|
call mtr.add_suppression('Got fatal error 1236 from master when reading data from binary log: .*could not find next log');
|
||||||
|
connection slave;
|
||||||
|
source include/wait_for_slave_io_to_stop.inc;
|
||||||
|
let $last_error= query_get_value(SHOW SLAVE STATUS, Last_IO_Error, 1);
|
||||||
|
echo Last_IO_Error;
|
||||||
|
echo $last_error;
|
||||||
|
|
||||||
|
connection master;
|
||||||
|
|
||||||
|
source include/truncate_file.inc;
|
||||||
|
|
||||||
|
if (`SELECT CONVERT(@@VERSION_COMPILE_OS USING latin1) NOT IN ('Win32', 'Win64', 'Windows')`)
|
||||||
|
{
|
||||||
|
append_file $MYSQLD_DATADIR/master-bin.index;
|
||||||
|
./master-bin.000001
|
||||||
|
./master-bin.000002
|
||||||
|
./master-bin.000003
|
||||||
|
EOF
|
||||||
|
sleep 0.00000001;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (`SELECT CONVERT(@@VERSION_COMPILE_OS USING latin1) IN ('Win32', 'Win64', 'Windows')`)
|
||||||
|
{
|
||||||
|
append_file $MYSQLD_DATADIR/master-bin.index;
|
||||||
|
.\master-bin.000001
|
||||||
|
.\master-bin.000002
|
||||||
|
.\master-bin.000003
|
||||||
|
EOF
|
||||||
|
sleep 0.00000001;
|
||||||
|
}
|
||||||
|
|
||||||
|
CREATE TABLE t2(c1 INT);
|
||||||
|
FLUSH LOGS;
|
||||||
|
CREATE TABLE t3(c1 INT);
|
||||||
|
FLUSH LOGS;
|
||||||
|
CREATE TABLE t4(c1 INT);
|
||||||
|
|
||||||
|
connection slave;
|
||||||
|
START SLAVE IO_THREAD;
|
||||||
|
source include/wait_for_slave_io_to_start.inc;
|
||||||
|
|
||||||
|
connection master;
|
||||||
|
sync_slave_with_master;
|
||||||
|
SHOW TABLES;
|
||||||
|
|
||||||
|
connection master;
|
||||||
|
DROP TABLE t1, t2, t3, t4;
|
||||||
|
source include/master-slave-end.inc;
|
@ -3,12 +3,16 @@
|
|||||||
#
|
#
|
||||||
source include/master-slave.inc;
|
source include/master-slave.inc;
|
||||||
|
|
||||||
|
CALL mtr.add_suppression('Statement may not be safe to log in statement format.');
|
||||||
|
|
||||||
create table t1(id int, i int, r1 int, r2 int, p varchar(100));
|
create table t1(id int, i int, r1 int, r2 int, p varchar(100));
|
||||||
insert into t1 values(1, connection_id(), 0, 0, "");
|
insert into t1 values(1, connection_id(), 0, 0, "");
|
||||||
# don't put rand and password in the same query, to see if they replicate
|
# don't put rand and password in the same query, to see if they replicate
|
||||||
# independently
|
# independently
|
||||||
# Pure rand test
|
# Pure rand test
|
||||||
|
--disable_warnings
|
||||||
insert into t1 values(2, 0, rand()*1000, rand()*1000, "");
|
insert into t1 values(2, 0, rand()*1000, rand()*1000, "");
|
||||||
|
--enable_warnings
|
||||||
# change the rand suite on the master (we do this because otherwise password()
|
# change the rand suite on the master (we do this because otherwise password()
|
||||||
# benefits from the fact that the above rand() is well replicated :
|
# benefits from the fact that the above rand() is well replicated :
|
||||||
# it picks the same sequence element, which hides a possible bug in password() replication.
|
# it picks the same sequence element, which hides a possible bug in password() replication.
|
||||||
@ -19,7 +23,9 @@ set sql_log_bin=1;
|
|||||||
# Pure password test
|
# Pure password test
|
||||||
insert into t1 values(3, 0, 0, 0, password('does_this_work?'));
|
insert into t1 values(3, 0, 0, 0, password('does_this_work?'));
|
||||||
# "altogether now"
|
# "altogether now"
|
||||||
|
--disable_warnings
|
||||||
insert into t1 values(4, connection_id(), rand()*1000, rand()*1000, password('does_this_still_work?'));
|
insert into t1 values(4, connection_id(), rand()*1000, rand()*1000, password('does_this_still_work?'));
|
||||||
|
--enable_warnings
|
||||||
select * into outfile 'rpl_misc_functions.outfile' from t1;
|
select * into outfile 'rpl_misc_functions.outfile' from t1;
|
||||||
let $MYSQLD_DATADIR= `select @@datadir`;
|
let $MYSQLD_DATADIR= `select @@datadir`;
|
||||||
sync_slave_with_master;
|
sync_slave_with_master;
|
||||||
@ -73,11 +79,13 @@ DELIMITER ;|
|
|||||||
|
|
||||||
# Exercise the functions and procedures then compare the results on
|
# Exercise the functions and procedures then compare the results on
|
||||||
# the master to those on the slave.
|
# the master to those on the slave.
|
||||||
|
--disable_warnings
|
||||||
CALL test_replication_sp1();
|
CALL test_replication_sp1();
|
||||||
CALL test_replication_sp2();
|
CALL test_replication_sp2();
|
||||||
INSERT INTO t1 (col_a) VALUES (test_replication_sf());
|
INSERT INTO t1 (col_a) VALUES (test_replication_sf());
|
||||||
INSERT INTO t1 (col_a) VALUES (test_replication_sf());
|
INSERT INTO t1 (col_a) VALUES (test_replication_sf());
|
||||||
INSERT INTO t1 (col_a) VALUES (test_replication_sf());
|
INSERT INTO t1 (col_a) VALUES (test_replication_sf());
|
||||||
|
--enable_warnings
|
||||||
|
|
||||||
--sync_slave_with_master
|
--sync_slave_with_master
|
||||||
|
|
||||||
|
53
mysql-test/suite/rpl/t/rpl_myisam_null_values.test
Normal file
53
mysql-test/suite/rpl/t/rpl_myisam_null_values.test
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
# BUG#49481: RBR: MyISAM and bit fields may cause slave to stop on delete cant find record
|
||||||
|
# BUG#49482: RBR: Replication may break on deletes when MyISAM tables + char field are used
|
||||||
|
|
||||||
|
-- source include/master-slave.inc
|
||||||
|
-- source include/have_binlog_format_mixed_or_row.inc
|
||||||
|
|
||||||
|
-- connection master
|
||||||
|
CREATE TABLE t1 (c1 BIT, c2 INT);
|
||||||
|
INSERT INTO `t1` VALUES ( 1, 1 );
|
||||||
|
UPDATE t1 SET c1=NULL where c2=1;
|
||||||
|
-- sync_slave_with_master
|
||||||
|
|
||||||
|
-- let $diff_table_1=master:test.t1
|
||||||
|
-- let $diff_table_2=slave:test.t1
|
||||||
|
-- source include/diff_tables.inc
|
||||||
|
|
||||||
|
-- connection master
|
||||||
|
DELETE FROM t1 WHERE c2=1 LIMIT 1;
|
||||||
|
-- sync_slave_with_master
|
||||||
|
|
||||||
|
-- let $diff_table_1=master:test.t1
|
||||||
|
-- let $diff_table_2=slave:test.t1
|
||||||
|
-- source include/diff_tables.inc
|
||||||
|
|
||||||
|
-- connection master
|
||||||
|
DROP TABLE t1;
|
||||||
|
-- sync_slave_with_master
|
||||||
|
|
||||||
|
-- connection master
|
||||||
|
|
||||||
|
CREATE TABLE t1 (c1 CHAR);
|
||||||
|
|
||||||
|
INSERT INTO t1 ( c1 ) VALUES ( 'w' ) ;
|
||||||
|
SELECT * FROM t1;
|
||||||
|
-- echo # should trigger switch to row due to LIMIT
|
||||||
|
UPDATE t1 SET c1=NULL WHERE c1='w' LIMIT 2;
|
||||||
|
-- sync_slave_with_master
|
||||||
|
|
||||||
|
-- let $diff_table_1=master:test.t1
|
||||||
|
-- let $diff_table_2=slave:test.t1
|
||||||
|
-- source include/diff_tables.inc
|
||||||
|
|
||||||
|
-- connection master
|
||||||
|
DELETE FROM t1 LIMIT 2;
|
||||||
|
-- sync_slave_with_master
|
||||||
|
|
||||||
|
-- let $diff_table_1=master:test.t1
|
||||||
|
-- let $diff_table_2=slave:test.t1
|
||||||
|
-- source include/diff_tables.inc
|
||||||
|
|
||||||
|
-- connection master
|
||||||
|
DROP TABLE t1;
|
||||||
|
-- sync_slave_with_master
|
@ -17,6 +17,8 @@
|
|||||||
|
|
||||||
--source include/master-slave.inc
|
--source include/master-slave.inc
|
||||||
|
|
||||||
|
CALL mtr.add_suppression('Statement may not be safe to log in statement format.');
|
||||||
|
|
||||||
CREATE TABLE t1 (a VARCHAR(1000));
|
CREATE TABLE t1 (a VARCHAR(1000));
|
||||||
|
|
||||||
# We replicate the connection_id in the query_log_event
|
# We replicate the connection_id in the query_log_event
|
||||||
@ -41,7 +43,9 @@ INSERT INTO t1 VALUES
|
|||||||
(UTC_TIMESTAMP());
|
(UTC_TIMESTAMP());
|
||||||
|
|
||||||
# We replicate the random seed in a rand_log_event
|
# We replicate the random seed in a rand_log_event
|
||||||
|
--disable_warnings
|
||||||
INSERT INTO t1 VALUES (RAND());
|
INSERT INTO t1 VALUES (RAND());
|
||||||
|
--enable_warnings
|
||||||
# We replicate the last_insert_id in an intvar_log_event
|
# We replicate the last_insert_id in an intvar_log_event
|
||||||
INSERT INTO t1 VALUES (LAST_INSERT_ID());
|
INSERT INTO t1 VALUES (LAST_INSERT_ID());
|
||||||
|
|
||||||
|
@ -15,6 +15,7 @@
|
|||||||
|
|
||||||
disable_query_log;
|
disable_query_log;
|
||||||
call mtr.add_suppression("Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT");
|
call mtr.add_suppression("Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT");
|
||||||
|
CALL mtr.add_suppression('Statement may not be safe to log in statement format.');
|
||||||
enable_query_log;
|
enable_query_log;
|
||||||
|
|
||||||
create table t1 (a int not null auto_increment primary key, b int, key(b));
|
create table t1 (a int not null auto_increment primary key, b int, key(b));
|
||||||
@ -34,8 +35,8 @@ INSERT INTO t1 (a) SELECT null FROM t1;
|
|||||||
INSERT INTO t1 (a) SELECT null FROM t1;
|
INSERT INTO t1 (a) SELECT null FROM t1;
|
||||||
save_master_pos;
|
save_master_pos;
|
||||||
# a few updates to force OPTIMIZE to do something
|
# a few updates to force OPTIMIZE to do something
|
||||||
update t1 set b=(a/2*rand());
|
|
||||||
--disable_warnings
|
--disable_warnings
|
||||||
|
update t1 set b=(a/2*rand());
|
||||||
delete from t1 order by b limit 10000;
|
delete from t1 order by b limit 10000;
|
||||||
--enable_warnings
|
--enable_warnings
|
||||||
|
|
||||||
|
@ -2,38 +2,39 @@
|
|||||||
# BUG#42749: infinite loop writing to row based binlog - processlist shows
|
# BUG#42749: infinite loop writing to row based binlog - processlist shows
|
||||||
# "freeing items"
|
# "freeing items"
|
||||||
#
|
#
|
||||||
|
#
|
||||||
# WHY
|
# WHY
|
||||||
# ===
|
# ===
|
||||||
#
|
#
|
||||||
# This bug would make table map event to report data_written one byte less
|
# This bug would make table map event to report data_written one
|
||||||
# than what would actually be written in its body. This would cause one byte shorter
|
# byte less than what would actually be written in its body. This
|
||||||
# event end_log_pos. The ultimate impact was that it would make fixing the
|
# would cause one byte shorter event end_log_pos. The ultimate
|
||||||
# position in MYSQL_BIN_LOG::write_cache bogus or end up in an infinite loop.
|
# impact was that it would make fixing the position in
|
||||||
|
# MYSQL_BIN_LOG::write_cache bogus or end up in an infinite loop.
|
||||||
#
|
#
|
||||||
# HOW
|
# HOW
|
||||||
# ===
|
# ===
|
||||||
#
|
#
|
||||||
# Checking that the patch fixes the problem is done as follows:
|
# Checking that the patch fixes the problem is done as follows:
|
||||||
# i) a table with several fields is created;
|
#
|
||||||
|
# i) one table with m_field_metadata sized at 290
|
||||||
# ii) an insert is performed;
|
# ii) an insert is performed;
|
||||||
# iii) the logs are flushed;
|
# iii) the logs are flushed;
|
||||||
# iv) mysqlbinlog is used to check if it succeeds.
|
# iv) mysqlbinlog is used to check if it succeeds.
|
||||||
#
|
#
|
||||||
# In step iv), before the bug was fixed, the test case would fail with
|
# In step iv), before the bug was fixed, the test case would fail
|
||||||
# mysqlbinlog reporting that it was unable to succeed in reading the event.
|
# with mysqlbinlog reporting that it was unable to succeed in
|
||||||
#
|
# reading the event.
|
||||||
|
|
||||||
-- source include/have_log_bin.inc
|
-- source include/master-slave.inc
|
||||||
-- source include/have_innodb.inc
|
-- source include/have_innodb.inc
|
||||||
-- source include/have_binlog_format_row.inc
|
-- source include/have_binlog_format_row.inc
|
||||||
-- connection default
|
|
||||||
|
|
||||||
RESET MASTER;
|
|
||||||
|
|
||||||
-- disable_warnings
|
-- disable_warnings
|
||||||
DROP TABLE IF EXISTS `t1`;
|
DROP TABLE IF EXISTS `t1`;
|
||||||
-- enable_warnings
|
-- enable_warnings
|
||||||
|
|
||||||
|
-- echo ### TABLE with field_metadata_size == 290
|
||||||
CREATE TABLE `t1` (
|
CREATE TABLE `t1` (
|
||||||
`c1` int(11) NOT NULL AUTO_INCREMENT,
|
`c1` int(11) NOT NULL AUTO_INCREMENT,
|
||||||
`c2` varchar(30) NOT NULL,
|
`c2` varchar(30) NOT NULL,
|
||||||
@ -185,15 +186,155 @@ CREATE TABLE `t1` (
|
|||||||
) ENGINE=InnoDB;
|
) ENGINE=InnoDB;
|
||||||
|
|
||||||
LOCK TABLES `t1` WRITE;
|
LOCK TABLES `t1` WRITE;
|
||||||
|
INSERT INTO `t1`(c2) VALUES ('1');
|
||||||
|
FLUSH LOGS;
|
||||||
|
|
||||||
INSERT INTO `t1` VALUES ('1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1');
|
-- sync_slave_with_master
|
||||||
|
-- connection master
|
||||||
|
|
||||||
|
-- echo ### assertion: the slave replicated event successfully and tables match
|
||||||
|
-- let $diff_table_1=master:test.t1
|
||||||
|
-- let $diff_table_2=slave:test.t1
|
||||||
|
-- source include/diff_tables.inc
|
||||||
|
|
||||||
DROP TABLE `t1`;
|
DROP TABLE `t1`;
|
||||||
|
|
||||||
FLUSH LOGS;
|
-- connection master
|
||||||
|
-- sync_slave_with_master
|
||||||
|
-- connection master
|
||||||
|
|
||||||
-- echo === Using mysqlbinlog to detect failure. Before the patch mysqlbinlog would find a corrupted event, thence would fail.
|
-- echo === Using mysqlbinlog to detect failure. Before the patch mysqlbinlog would find a corrupted event, thence would fail.
|
||||||
|
|
||||||
-- let $MYSQLD_DATADIR= `SELECT @@datadir`;
|
-- let $MYSQLD_DATADIR= `SELECT @@datadir`;
|
||||||
-- exec $MYSQL_BINLOG $MYSQLD_DATADIR/master-bin.000001 > $MYSQLTEST_VARDIR/tmp/mysqlbinlog_bug42749.binlog
|
-- exec $MYSQL_BINLOG $MYSQLD_DATADIR/master-bin.000001 > $MYSQLTEST_VARDIR/tmp/mysqlbinlog_bug42749.binlog
|
||||||
-- remove_file $MYSQLTEST_VARDIR/tmp/mysqlbinlog_bug42749.binlog
|
-- remove_file $MYSQLTEST_VARDIR/tmp/mysqlbinlog_bug42749.binlog
|
||||||
|
|
||||||
|
#############################################################
|
||||||
|
# BUG#50018: binlog corruption when table has many columns
|
||||||
|
#
|
||||||
|
# Same test from BUG#42749, but now we generate some SQL which
|
||||||
|
# creates and inserts into tables with metadata size from 249
|
||||||
|
# to 258.
|
||||||
|
#
|
||||||
|
# The test works as follows:
|
||||||
|
# 1. SQL for several CREATE TABLE and INSERTS are generated
|
||||||
|
# into a file.
|
||||||
|
# 2. This file is then "sourced"
|
||||||
|
# 3. The slave is synchronized with the master
|
||||||
|
# 4. FLUSH LOGS on master
|
||||||
|
# 5. Compare tables on master and slave.
|
||||||
|
# 6. run mysqlbinlog on master's binary log
|
||||||
|
#
|
||||||
|
# Steps #5 and #6 assert that binary log is not corrupted
|
||||||
|
# in both cases: when slave is replaying events and when
|
||||||
|
# mysqlbinlog is used to read the binary log
|
||||||
|
|
||||||
|
-- source include/master-slave-reset.inc
|
||||||
|
-- connection master
|
||||||
|
|
||||||
|
# Create several tables with field_metadata_size ranging
|
||||||
|
# from 249 to 258 (so that we cover 251 and 255 range).
|
||||||
|
# This should exercise the switch between using 1 or 3
|
||||||
|
# bytes to pack m_field_metadata_size.
|
||||||
|
#
|
||||||
|
# Each varchar field takes up to 2 metadata bytes, see:
|
||||||
|
#
|
||||||
|
# Field_varstring::do_save_field_metadata (field.cc)
|
||||||
|
#
|
||||||
|
# The float field takes 1 byte, see:
|
||||||
|
#
|
||||||
|
# Field_float::do_save_field_metadata (field.cc)
|
||||||
|
#
|
||||||
|
|
||||||
|
-- let $generated_sql= $MYSQLTEST_VARDIR/tmp/b50018.sql
|
||||||
|
-- let B50018_FILE= $generated_sql
|
||||||
|
|
||||||
|
-- echo ### action: generating several tables with different metadata
|
||||||
|
-- echo ### sizes (resorting to perl)
|
||||||
|
-- perl
|
||||||
|
my $file= $ENV{'B50018_FILE'};
|
||||||
|
open(FILE, ">", "$file") or die "Unable to open bug 50018 generated SQL file: $!" ;
|
||||||
|
|
||||||
|
my $tables= "";
|
||||||
|
my $ntables= 10;
|
||||||
|
my $base_ncols= 124;
|
||||||
|
|
||||||
|
for my $i (1..$ntables)
|
||||||
|
{
|
||||||
|
my $ncols= $base_ncols + $i;
|
||||||
|
my $metadata_size= $ncols_variable * 2 + 1;
|
||||||
|
|
||||||
|
print FILE "-- echo ### testing table with " . ($base_ncols*2 + $i) . " field metadata size.\n";
|
||||||
|
print FILE "CREATE TABLE t$i (\n";
|
||||||
|
for my $n (1..$base_ncols)
|
||||||
|
{
|
||||||
|
print FILE "c$n VARCHAR(30) NOT NULL DEFAULT 'BUG#50018',\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
for my $n (1..$i)
|
||||||
|
{
|
||||||
|
print FILE "c" . ($base_ncols+$n) . " FLOAT NOT NULL DEFAULT 0";
|
||||||
|
if ($n < $i)
|
||||||
|
{
|
||||||
|
print FILE ",\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
print FILE ") Engine=InnoDB;\n";
|
||||||
|
|
||||||
|
$tables.= " t$i WRITE";
|
||||||
|
if ($i < $ntables)
|
||||||
|
{
|
||||||
|
$tables .=",";
|
||||||
|
}
|
||||||
|
|
||||||
|
print FILE "LOCK TABLES t$i WRITE;\n";
|
||||||
|
print FILE "INSERT INTO t$i(c". ($base_ncols+1) . ") VALUES (50018);\n";
|
||||||
|
print FILE "UNLOCK TABLES;";
|
||||||
|
}
|
||||||
|
|
||||||
|
close(FILE);
|
||||||
|
|
||||||
|
EOF
|
||||||
|
|
||||||
|
## we don't need this in the result file
|
||||||
|
## however, for debugging purposes you
|
||||||
|
## may want to reactivate query logging
|
||||||
|
-- disable_query_log
|
||||||
|
-- source $generated_sql
|
||||||
|
-- enable_query_log
|
||||||
|
|
||||||
|
-- sync_slave_with_master
|
||||||
|
-- connection master
|
||||||
|
|
||||||
|
FLUSH LOGS;
|
||||||
|
|
||||||
|
-- let $ntables=10
|
||||||
|
while($ntables)
|
||||||
|
{
|
||||||
|
-- echo ### assertion: the slave replicated event successfully and tables match for t$ntables
|
||||||
|
-- let $diff_table_1=master:test.t$ntables
|
||||||
|
-- let $diff_table_2=slave:test.t$ntables
|
||||||
|
-- source include/diff_tables.inc
|
||||||
|
|
||||||
|
-- connection master
|
||||||
|
-- disable_query_log
|
||||||
|
-- eval DROP TABLE t$ntables
|
||||||
|
-- enable_query_log
|
||||||
|
-- sync_slave_with_master
|
||||||
|
-- connection master
|
||||||
|
|
||||||
|
-- dec $ntables
|
||||||
|
}
|
||||||
|
|
||||||
|
-- echo ### assertion: check that binlog is not corrupt. Using mysqlbinlog to
|
||||||
|
-- echo ### detect failure. Before the patch mysqlbinlog would find
|
||||||
|
-- echo ### a corrupted event, thence would fail.
|
||||||
|
-- let $MYSQLD_DATADIR= `SELECT @@datadir`;
|
||||||
|
-- exec $MYSQL_BINLOG -v --hex $MYSQLD_DATADIR/master-bin.000001 > $MYSQLTEST_VARDIR/tmp/mysqlbinlog_bug50018.binlog
|
||||||
|
|
||||||
|
## clean up
|
||||||
|
## For debugging purposes you might want not to remove these
|
||||||
|
-- remove_file $MYSQLTEST_VARDIR/tmp/mysqlbinlog_bug50018.binlog
|
||||||
|
-- remove_file $generated_sql
|
||||||
|
-- source include/master-slave-end.inc
|
@ -524,7 +524,7 @@ id hex(b1) vc bc d f total y t
|
|||||||
--- Check Update on slave ---
|
--- Check Update on slave ---
|
||||||
SELECT id,hex(b1),vc,bc,d,f,total,y,t FROM t1 WHERE id = 412;
|
SELECT id,hex(b1),vc,bc,d,f,total,y,t FROM t1 WHERE id = 412;
|
||||||
id hex(b1) vc bc d f total y t
|
id hex(b1) vc bc d f total y t
|
||||||
412 0 Testing MySQL databases is a cool Must make it bug free for the customer 654321.4321 15.21 0 1965 2006-02-22
|
412 1 Testing MySQL databases is a cool Must make it bug free for the customer 654321.4321 15.21 0 1965 2005-11-14
|
||||||
--- Remove a record from t1 on master ---
|
--- Remove a record from t1 on master ---
|
||||||
DELETE FROM t1 WHERE id = 42;
|
DELETE FROM t1 WHERE id = 42;
|
||||||
--- Show current count on master for t1 ---
|
--- Show current count on master for t1 ---
|
||||||
|
@ -4,6 +4,7 @@ reset master;
|
|||||||
reset slave;
|
reset slave;
|
||||||
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
|
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
|
||||||
start slave;
|
start slave;
|
||||||
|
CALL mtr.add_suppression('Statement may not be safe to log in statement format.');
|
||||||
DROP FUNCTION IF EXISTS test.f1;
|
DROP FUNCTION IF EXISTS test.f1;
|
||||||
DROP TABLE IF EXISTS test.t1;
|
DROP TABLE IF EXISTS test.t1;
|
||||||
CREATE TABLE test.t1 (a INT NOT NULL AUTO_INCREMENT, c CHAR(16),PRIMARY KEY(a))ENGINE=NDB;
|
CREATE TABLE test.t1 (a INT NOT NULL AUTO_INCREMENT, c CHAR(16),PRIMARY KEY(a))ENGINE=NDB;
|
||||||
|
@ -1061,6 +1061,18 @@ ALTER TABLE t1 CHANGE COLUMN f1 f1_no_real_change TIMESTAMP NULL DEFAULT NULL;
|
|||||||
--disable_info
|
--disable_info
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # Bug #31145: ALTER TABLE DROP COLUMN, ADD COLUMN crashes (linux)
|
||||||
|
--echo # or freezes (win) the server
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
CREATE TABLE t1 (a TEXT, id INT, b INT);
|
||||||
|
ALTER TABLE t1 DROP COLUMN a, ADD COLUMN c TEXT FIRST;
|
||||||
|
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
|
||||||
--echo End of 5.1 tests
|
--echo End of 5.1 tests
|
||||||
|
|
||||||
#
|
#
|
||||||
|
@ -35,6 +35,25 @@ insert into t1 values ('NYC Lib','New York');
|
|||||||
select t2.isbn,city,t1.libname,count(t1.libname) as a from t3 left join t1 on t3.libname=t1.libname left join t2 on t3.isbn=t2.isbn group by city,t1.libname;
|
select t2.isbn,city,t1.libname,count(t1.libname) as a from t3 left join t1 on t3.libname=t1.libname left join t2 on t3.isbn=t2.isbn group by city,t1.libname;
|
||||||
select t2.isbn,city,t1.libname,count(distinct t1.libname) as a from t3 left join t1 on t3.libname=t1.libname left join t2 on t3.isbn=t2.isbn group by city having count(distinct t1.libname) > 1;
|
select t2.isbn,city,t1.libname,count(distinct t1.libname) as a from t3 left join t1 on t3.libname=t1.libname left join t2 on t3.isbn=t2.isbn group by city having count(distinct t1.libname) > 1;
|
||||||
select t2.isbn,city,t1.libname,count(distinct t1.libname) as a from t3 left join t1 on t3.libname=t1.libname left join t2 on t3.isbn=t2.isbn group by city having count(distinct concat(t1.libname,'a')) > 1;
|
select t2.isbn,city,t1.libname,count(distinct t1.libname) as a from t3 left join t1 on t3.libname=t1.libname left join t2 on t3.isbn=t2.isbn group by city having count(distinct concat(t1.libname,'a')) > 1;
|
||||||
|
|
||||||
|
select t2.isbn,city,@bar:=t1.libname,count(distinct t1.libname) as a
|
||||||
|
from t3 left join t1 on t3.libname=t1.libname left join t2
|
||||||
|
on t3.isbn=t2.isbn group by city having count(distinct
|
||||||
|
t1.libname) > 1;
|
||||||
|
#
|
||||||
|
# Wrong result, see bug#49872
|
||||||
|
#
|
||||||
|
SELECT @bar;
|
||||||
|
|
||||||
|
select t2.isbn,city,concat(@bar:=t1.libname),count(distinct t1.libname) as a
|
||||||
|
from t3 left join t1 on t3.libname=t1.libname left join t2
|
||||||
|
on t3.isbn=t2.isbn group by city having count(distinct
|
||||||
|
t1.libname) > 1;
|
||||||
|
#
|
||||||
|
# Wrong result, see bug#49872
|
||||||
|
#
|
||||||
|
SELECT @bar;
|
||||||
|
|
||||||
drop table t1, t2, t3;
|
drop table t1, t2, t3;
|
||||||
|
|
||||||
#
|
#
|
||||||
|
@ -80,7 +80,7 @@ CREATE TABLE t3 (
|
|||||||
FULLTEXT KEY betreff (betreff)
|
FULLTEXT KEY betreff (betreff)
|
||||||
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=996 ;
|
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=996 ;
|
||||||
|
|
||||||
--error 1054
|
--error ER_CANT_USE_OPTION_HERE
|
||||||
select a.text, b.id, b.betreff
|
select a.text, b.id, b.betreff
|
||||||
from
|
from
|
||||||
t2 a inner join t3 b on a.id = b.forum inner join
|
t2 a inner join t3 b on a.id = b.forum inner join
|
||||||
@ -100,7 +100,7 @@ group by
|
|||||||
order by
|
order by
|
||||||
match(b.betreff) against ('+abc' in boolean mode) desc;
|
match(b.betreff) against ('+abc' in boolean mode) desc;
|
||||||
|
|
||||||
--error 1054
|
--error ER_CANT_USE_OPTION_HERE
|
||||||
select a.text, b.id, b.betreff
|
select a.text, b.id, b.betreff
|
||||||
from
|
from
|
||||||
t2 a inner join t3 b on a.id = b.forum inner join
|
t2 a inner join t3 b on a.id = b.forum inner join
|
||||||
@ -117,6 +117,7 @@ where
|
|||||||
order by
|
order by
|
||||||
match(b.betreff) against ('+abc' in boolean mode) desc;
|
match(b.betreff) against ('+abc' in boolean mode) desc;
|
||||||
|
|
||||||
|
--error ER_CANT_USE_OPTION_HERE
|
||||||
select a.text, b.id, b.betreff
|
select a.text, b.id, b.betreff
|
||||||
from
|
from
|
||||||
t2 a inner join t3 b on a.id = b.forum inner join
|
t2 a inner join t3 b on a.id = b.forum inner join
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
|
|
||||||
--disable_warnings
|
--disable_warnings
|
||||||
DROP TABLE IF EXISTS t1;
|
DROP TABLE IF EXISTS t1;
|
||||||
|
DROP PROCEDURE IF EXISTS p1;
|
||||||
--enable_warnings
|
--enable_warnings
|
||||||
|
|
||||||
CREATE TABLE t1 ( number INT NOT NULL, alpha CHAR(6) NOT NULL );
|
CREATE TABLE t1 ( number INT NOT NULL, alpha CHAR(6) NOT NULL );
|
||||||
@ -111,4 +112,16 @@ EXPLAIN SELECT CONCAT('gui_', t2.a), t1.d FROM t2
|
|||||||
DROP TABLE t1, t2;
|
DROP TABLE t1, t2;
|
||||||
|
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # Bug #50096: CONCAT_WS inside procedure returning wrong data
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
CREATE PROCEDURE p1(a varchar(255), b int, c int)
|
||||||
|
SET @query = CONCAT_WS(",", a, b, c);
|
||||||
|
|
||||||
|
CALL p1("abcde", "0", "1234");
|
||||||
|
SELECT @query;
|
||||||
|
|
||||||
|
DROP PROCEDURE p1;
|
||||||
|
|
||||||
--echo # End of 5.1 tests
|
--echo # End of 5.1 tests
|
||||||
|
@ -2014,6 +2014,22 @@ deallocate prepare stmt;
|
|||||||
drop table t1,t2;
|
drop table t1,t2;
|
||||||
--echo #
|
--echo #
|
||||||
|
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # Bug #49570: Assertion failed: !(order->used & map)
|
||||||
|
--echo # on re-execution of prepared statement
|
||||||
|
--echo #
|
||||||
|
CREATE TABLE t1(a INT PRIMARY KEY);
|
||||||
|
INSERT INTO t1 VALUES(0), (1);
|
||||||
|
PREPARE stmt FROM
|
||||||
|
"SELECT 1 FROM t1 JOIN t1 t2 USING(a) GROUP BY t2.a, t1.a";
|
||||||
|
EXECUTE stmt;
|
||||||
|
EXECUTE stmt;
|
||||||
|
EXECUTE stmt;
|
||||||
|
DEALLOCATE PREPARE stmt;
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
|
||||||
--echo End of 5.0 tests.
|
--echo End of 5.0 tests.
|
||||||
|
|
||||||
#
|
#
|
||||||
|
@ -8242,6 +8242,25 @@ while ($tab_count)
|
|||||||
DROP PROCEDURE p1;
|
DROP PROCEDURE p1;
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
#
|
||||||
|
# Bug#47649 crash during CALL procedure
|
||||||
|
#
|
||||||
|
CREATE TABLE t1 ( f1 integer, primary key (f1));
|
||||||
|
CREATE TABLE t2 LIKE t1;
|
||||||
|
CREATE TEMPORARY TABLE t3 LIKE t1;
|
||||||
|
delimiter |;
|
||||||
|
CREATE PROCEDURE p1 () BEGIN SELECT f1 FROM t3 AS A WHERE A.f1 IN ( SELECT f1 FROM t3 ) ;
|
||||||
|
END|
|
||||||
|
delimiter ;|
|
||||||
|
--error ER_CANT_REOPEN_TABLE
|
||||||
|
CALL p1;
|
||||||
|
CREATE VIEW t3 AS SELECT f1 FROM t2 A WHERE A.f1 IN ( SELECT f1 FROM t2 );
|
||||||
|
DROP TABLE t3;
|
||||||
|
CALL p1;
|
||||||
|
CALL p1;
|
||||||
|
DROP PROCEDURE p1;
|
||||||
|
DROP TABLE t1, t2;
|
||||||
|
DROP VIEW t3;
|
||||||
|
|
||||||
--echo #
|
--echo #
|
||||||
--echo # Bug #46629: Item_in_subselect::val_int(): Assertion `0'
|
--echo # Bug #46629: Item_in_subselect::val_int(): Assertion `0'
|
||||||
|
58
mysql-test/t/sp_sync.test
Normal file
58
mysql-test/t/sp_sync.test
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
# This test should work in embedded server after mysqltest is fixed
|
||||||
|
-- source include/not_embedded.inc
|
||||||
|
|
||||||
|
--echo Tests of syncronization of stored procedure execution.
|
||||||
|
|
||||||
|
--source include/have_debug_sync.inc
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # Bug#48157: crash in Item_field::used_tables
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
CREATE TABLE t1 AS SELECT 1 AS a, 1 AS b;
|
||||||
|
CREATE TABLE t2 AS SELECT 1 AS a, 1 AS b;
|
||||||
|
|
||||||
|
DELIMITER |;
|
||||||
|
|
||||||
|
CREATE PROCEDURE p1()
|
||||||
|
BEGIN
|
||||||
|
UPDATE t1 JOIN t2 USING( a, b ) SET t1.b = 1, t2.b = 1;
|
||||||
|
END|
|
||||||
|
|
||||||
|
DELIMITER ;|
|
||||||
|
|
||||||
|
connect (con1,localhost,root,,);
|
||||||
|
connect (con2,localhost,root,,);
|
||||||
|
|
||||||
|
connection con1;
|
||||||
|
LOCK TABLES t1 WRITE, t2 WRITE;
|
||||||
|
|
||||||
|
connection con2;
|
||||||
|
LET $ID= `select connection_id()`;
|
||||||
|
SET DEBUG_SYNC = 'multi_update_reopen_tables SIGNAL parked WAIT_FOR go';
|
||||||
|
--send CALL p1()
|
||||||
|
|
||||||
|
connection con1;
|
||||||
|
let $wait_condition= SELECT 1 FROM information_schema.processlist WHERE ID = $ID AND
|
||||||
|
state = "Locked";
|
||||||
|
--source include/wait_condition.inc
|
||||||
|
DROP TABLE t1, t2;
|
||||||
|
SET DEBUG_SYNC = 'now WAIT_FOR parked';
|
||||||
|
CREATE TABLE t1 AS SELECT 1 AS a, 1 AS b;
|
||||||
|
CREATE TABLE t2 AS SELECT 1 AS a, 1 AS b;
|
||||||
|
SET DEBUG_SYNC = 'now SIGNAL go';
|
||||||
|
|
||||||
|
connection con2;
|
||||||
|
--reap
|
||||||
|
|
||||||
|
disconnect con1;
|
||||||
|
disconnect con2;
|
||||||
|
connection default;
|
||||||
|
|
||||||
|
--echo # Without the DEBUG_SYNC supplied in the same patch as this test in the
|
||||||
|
--echo # code, this test statement will hang.
|
||||||
|
DROP TABLE t1, t2;
|
||||||
|
DROP PROCEDURE p1;
|
||||||
|
|
||||||
|
SET DEBUG_SYNC = 'RESET';
|
||||||
|
|
@ -1062,3 +1062,58 @@ SELECT ( SELECT a UNION SELECT a ) INTO OUTFILE 'union.out.file3' FROM t1;
|
|||||||
SELECT ( SELECT a UNION SELECT a ) INTO DUMPFILE 'union.out.file4' FROM t1;
|
SELECT ( SELECT a UNION SELECT a ) INTO DUMPFILE 'union.out.file4' FROM t1;
|
||||||
|
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # Bug #49734: Crash on EXPLAIN EXTENDED UNION ... ORDER BY
|
||||||
|
--echo # <any non-const-function>
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
CREATE TABLE t1 (a VARCHAR(10), FULLTEXT KEY a (a));
|
||||||
|
INSERT INTO t1 VALUES (1),(2);
|
||||||
|
CREATE TABLE t2 (b INT);
|
||||||
|
INSERT INTO t2 VALUES (1),(2);
|
||||||
|
|
||||||
|
--echo # Should not crash
|
||||||
|
EXPLAIN EXTENDED
|
||||||
|
SELECT * FROM t1 UNION SELECT * FROM t1 ORDER BY a + 12;
|
||||||
|
|
||||||
|
--echo # Should not crash
|
||||||
|
SELECT * FROM t1 UNION SELECT * FROM t1 ORDER BY a + 12;
|
||||||
|
|
||||||
|
|
||||||
|
--echo # Should not crash
|
||||||
|
--error ER_CANT_USE_OPTION_HERE
|
||||||
|
EXPLAIN EXTENDED
|
||||||
|
SELECT * FROM t1 UNION SELECT * FROM t1
|
||||||
|
ORDER BY MATCH(a) AGAINST ('+abc' IN BOOLEAN MODE);
|
||||||
|
|
||||||
|
--echo # Should not crash
|
||||||
|
--error ER_CANT_USE_OPTION_HERE
|
||||||
|
SELECT * FROM t1 UNION SELECT * FROM t1
|
||||||
|
ORDER BY MATCH(a) AGAINST ('+abc' IN BOOLEAN MODE);
|
||||||
|
|
||||||
|
--echo # Should not crash
|
||||||
|
(SELECT * FROM t1) UNION (SELECT * FROM t1)
|
||||||
|
ORDER BY MATCH(a) AGAINST ('+abc' IN BOOLEAN MODE);
|
||||||
|
|
||||||
|
|
||||||
|
--echo # Should not crash
|
||||||
|
EXPLAIN EXTENDED
|
||||||
|
SELECT * FROM t1 UNION SELECT * FROM t1
|
||||||
|
ORDER BY (SELECT a FROM t2 WHERE b = 12);
|
||||||
|
|
||||||
|
--echo # Should not crash
|
||||||
|
--disable_result_log
|
||||||
|
SELECT * FROM t1 UNION SELECT * FROM t1
|
||||||
|
ORDER BY (SELECT a FROM t2 WHERE b = 12);
|
||||||
|
--enable_result_log
|
||||||
|
|
||||||
|
--echo # Should not crash
|
||||||
|
SELECT * FROM t2 UNION SELECT * FROM t2
|
||||||
|
ORDER BY (SELECT * FROM t1 WHERE MATCH(a) AGAINST ('+abc' IN BOOLEAN MODE));
|
||||||
|
|
||||||
|
DROP TABLE t1,t2;
|
||||||
|
|
||||||
|
|
||||||
|
--echo End of 5.1 tests
|
||||||
|
@ -293,6 +293,26 @@ SELECT @a, @b;
|
|||||||
SELECT a, b FROM t1 WHERE a=2 AND b=3 GROUP BY a, b;
|
SELECT a, b FROM t1 WHERE a=2 AND b=3 GROUP BY a, b;
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
#
|
||||||
|
# Bug#47371: reference by same column name
|
||||||
|
#
|
||||||
|
CREATE TABLE t1 (f1 int(11) default NULL, f2 int(11) default NULL);
|
||||||
|
CREATE TABLE t2 (f1 int(11) default NULL, f2 int(11) default NULL, foo int(11));
|
||||||
|
CREATE TABLE t3 (f1 int(11) default NULL, f2 int(11) default NULL);
|
||||||
|
|
||||||
|
INSERT INTO t1 VALUES(10, 10);
|
||||||
|
INSERT INTO t1 VALUES(10, 10);
|
||||||
|
INSERT INTO t2 VALUES(10, 10, 10);
|
||||||
|
INSERT INTO t2 VALUES(10, 10, 10);
|
||||||
|
INSERT INTO t3 VALUES(10, 10);
|
||||||
|
INSERT INTO t3 VALUES(10, 10);
|
||||||
|
|
||||||
|
SELECT MIN(t2.f1),
|
||||||
|
@bar:= (SELECT MIN(t3.f2) FROM t3 WHERE t3.f2 > foo)
|
||||||
|
FROM t1,t2 WHERE t1.f1 = t2.f1 ORDER BY t2.f1;
|
||||||
|
|
||||||
|
DROP TABLE t1, t2, t3;
|
||||||
|
|
||||||
--echo End of 5.0 tests
|
--echo End of 5.0 tests
|
||||||
|
|
||||||
#
|
#
|
||||||
|
@ -7835,8 +7835,7 @@ uint Field_blob::is_equal(Create_field *new_field)
|
|||||||
|
|
||||||
return ((new_field->sql_type == get_blob_type_from_length(max_data_length()))
|
return ((new_field->sql_type == get_blob_type_from_length(max_data_length()))
|
||||||
&& new_field->charset == field_charset &&
|
&& new_field->charset == field_charset &&
|
||||||
((Field_blob *)new_field->field)->max_data_length() ==
|
new_field->pack_length == pack_length());
|
||||||
max_data_length());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -5898,6 +5898,23 @@ const key_map *ha_partition::keys_to_use_for_scanning()
|
|||||||
DBUG_RETURN(m_file[0]->keys_to_use_for_scanning());
|
DBUG_RETURN(m_file[0]->keys_to_use_for_scanning());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define MAX_PARTS_FOR_OPTIMIZER_CALLS 10
|
||||||
|
/*
|
||||||
|
Prepare start variables for estimating optimizer costs.
|
||||||
|
|
||||||
|
@param[out] num_used_parts Number of partitions after pruning.
|
||||||
|
@param[out] check_min_num Number of partitions to call.
|
||||||
|
@param[out] first first used partition.
|
||||||
|
*/
|
||||||
|
void ha_partition::partitions_optimizer_call_preparations(uint *first,
|
||||||
|
uint *num_used_parts,
|
||||||
|
uint *check_min_num)
|
||||||
|
{
|
||||||
|
*first= bitmap_get_first_set(&(m_part_info->used_partitions));
|
||||||
|
*num_used_parts= bitmap_bits_set(&(m_part_info->used_partitions));
|
||||||
|
*check_min_num= min(MAX_PARTS_FOR_OPTIMIZER_CALLS, *num_used_parts);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Return time for a scan of the table
|
Return time for a scan of the table
|
||||||
@ -5911,43 +5928,67 @@ const key_map *ha_partition::keys_to_use_for_scanning()
|
|||||||
|
|
||||||
double ha_partition::scan_time()
|
double ha_partition::scan_time()
|
||||||
{
|
{
|
||||||
double scan_time= 0;
|
double scan_time= 0.0;
|
||||||
handler **file;
|
uint first, part_id, num_used_parts, check_min_num, partitions_called= 0;
|
||||||
DBUG_ENTER("ha_partition::scan_time");
|
DBUG_ENTER("ha_partition::scan_time");
|
||||||
|
|
||||||
for (file= m_file; *file; file++)
|
partitions_optimizer_call_preparations(&first, &num_used_parts, &check_min_num);
|
||||||
if (bitmap_is_set(&(m_part_info->used_partitions), (file - m_file)))
|
for (part_id= first; partitions_called < num_used_parts ; part_id++)
|
||||||
scan_time+= (*file)->scan_time();
|
{
|
||||||
|
if (!bitmap_is_set(&(m_part_info->used_partitions), part_id))
|
||||||
|
continue;
|
||||||
|
scan_time+= m_file[part_id]->scan_time();
|
||||||
|
partitions_called++;
|
||||||
|
if (partitions_called >= check_min_num && scan_time != 0.0)
|
||||||
|
{
|
||||||
|
DBUG_RETURN(scan_time *
|
||||||
|
(double) num_used_parts / (double) partitions_called);
|
||||||
|
}
|
||||||
|
}
|
||||||
DBUG_RETURN(scan_time);
|
DBUG_RETURN(scan_time);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Get time to read
|
Estimate rows for records_in_range or estimate_rows_upper_bound.
|
||||||
|
|
||||||
SYNOPSIS
|
@param is_records_in_range call records_in_range instead of
|
||||||
read_time()
|
estimate_rows_upper_bound.
|
||||||
index Index number used
|
@param inx (only for records_in_range) index to use.
|
||||||
ranges Number of ranges
|
@param min_key (only for records_in_range) start of range.
|
||||||
rows Number of rows
|
@param max_key (only for records_in_range) end of range.
|
||||||
|
|
||||||
RETURN VALUE
|
@return Number of rows or HA_POS_ERROR.
|
||||||
time for read
|
|
||||||
|
|
||||||
DESCRIPTION
|
|
||||||
This will be optimised later to include whether or not the index can
|
|
||||||
be used with partitioning. To achieve we need to add another parameter
|
|
||||||
that specifies how many of the index fields that are bound in the ranges.
|
|
||||||
Possibly added as a new call to handlers.
|
|
||||||
*/
|
*/
|
||||||
|
ha_rows ha_partition::estimate_rows(bool is_records_in_range, uint inx,
|
||||||
double ha_partition::read_time(uint index, uint ranges, ha_rows rows)
|
key_range *min_key, key_range *max_key)
|
||||||
{
|
{
|
||||||
DBUG_ENTER("ha_partition::read_time");
|
ha_rows rows, estimated_rows= 0;
|
||||||
|
uint first, part_id, num_used_parts, check_min_num, partitions_called= 0;
|
||||||
|
DBUG_ENTER("ha_partition::records_in_range");
|
||||||
|
|
||||||
DBUG_RETURN(m_file[0]->read_time(index, ranges, rows));
|
partitions_optimizer_call_preparations(&first, &num_used_parts, &check_min_num);
|
||||||
|
for (part_id= first; partitions_called < num_used_parts ; part_id++)
|
||||||
|
{
|
||||||
|
if (!bitmap_is_set(&(m_part_info->used_partitions), part_id))
|
||||||
|
continue;
|
||||||
|
if (is_records_in_range)
|
||||||
|
rows= m_file[part_id]->records_in_range(inx, min_key, max_key);
|
||||||
|
else
|
||||||
|
rows= m_file[part_id]->estimate_rows_upper_bound();
|
||||||
|
if (rows == HA_POS_ERROR)
|
||||||
|
DBUG_RETURN(HA_POS_ERROR);
|
||||||
|
estimated_rows+= rows;
|
||||||
|
partitions_called++;
|
||||||
|
if (partitions_called >= check_min_num && estimated_rows)
|
||||||
|
{
|
||||||
|
DBUG_RETURN(estimated_rows * num_used_parts / partitions_called);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
DBUG_RETURN(estimated_rows);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Find number of records in a range
|
Find number of records in a range
|
||||||
|
|
||||||
@ -5975,22 +6016,9 @@ double ha_partition::read_time(uint index, uint ranges, ha_rows rows)
|
|||||||
ha_rows ha_partition::records_in_range(uint inx, key_range *min_key,
|
ha_rows ha_partition::records_in_range(uint inx, key_range *min_key,
|
||||||
key_range *max_key)
|
key_range *max_key)
|
||||||
{
|
{
|
||||||
handler **file;
|
|
||||||
ha_rows in_range= 0;
|
|
||||||
DBUG_ENTER("ha_partition::records_in_range");
|
DBUG_ENTER("ha_partition::records_in_range");
|
||||||
|
|
||||||
file= m_file;
|
DBUG_RETURN(estimate_rows(TRUE, inx, min_key, max_key));
|
||||||
do
|
|
||||||
{
|
|
||||||
if (bitmap_is_set(&(m_part_info->used_partitions), (file - m_file)))
|
|
||||||
{
|
|
||||||
ha_rows tmp_in_range= (*file)->records_in_range(inx, min_key, max_key);
|
|
||||||
if (tmp_in_range == HA_POS_ERROR)
|
|
||||||
DBUG_RETURN(tmp_in_range);
|
|
||||||
in_range+= tmp_in_range;
|
|
||||||
}
|
|
||||||
} while (*(++file));
|
|
||||||
DBUG_RETURN(in_range);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -6006,22 +6034,36 @@ ha_rows ha_partition::records_in_range(uint inx, key_range *min_key,
|
|||||||
|
|
||||||
ha_rows ha_partition::estimate_rows_upper_bound()
|
ha_rows ha_partition::estimate_rows_upper_bound()
|
||||||
{
|
{
|
||||||
ha_rows rows, tot_rows= 0;
|
|
||||||
handler **file;
|
|
||||||
DBUG_ENTER("ha_partition::estimate_rows_upper_bound");
|
DBUG_ENTER("ha_partition::estimate_rows_upper_bound");
|
||||||
|
|
||||||
file= m_file;
|
DBUG_RETURN(estimate_rows(FALSE, 0, NULL, NULL));
|
||||||
do
|
}
|
||||||
{
|
|
||||||
if (bitmap_is_set(&(m_part_info->used_partitions), (file - m_file)))
|
|
||||||
{
|
/*
|
||||||
rows= (*file)->estimate_rows_upper_bound();
|
Get time to read
|
||||||
if (rows == HA_POS_ERROR)
|
|
||||||
DBUG_RETURN(HA_POS_ERROR);
|
SYNOPSIS
|
||||||
tot_rows+= rows;
|
read_time()
|
||||||
}
|
index Index number used
|
||||||
} while (*(++file));
|
ranges Number of ranges
|
||||||
DBUG_RETURN(tot_rows);
|
rows Number of rows
|
||||||
|
|
||||||
|
RETURN VALUE
|
||||||
|
time for read
|
||||||
|
|
||||||
|
DESCRIPTION
|
||||||
|
This will be optimised later to include whether or not the index can
|
||||||
|
be used with partitioning. To achieve we need to add another parameter
|
||||||
|
that specifies how many of the index fields that are bound in the ranges.
|
||||||
|
Possibly added as a new call to handlers.
|
||||||
|
*/
|
||||||
|
|
||||||
|
double ha_partition::read_time(uint index, uint ranges, ha_rows rows)
|
||||||
|
{
|
||||||
|
DBUG_ENTER("ha_partition::read_time");
|
||||||
|
|
||||||
|
DBUG_RETURN(m_file[0]->read_time(index, ranges, rows));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -552,6 +552,18 @@ public:
|
|||||||
-------------------------------------------------------------------------
|
-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
private:
|
||||||
|
/*
|
||||||
|
Helper function to get the minimum number of partitions to use for
|
||||||
|
the optimizer hints/cost calls.
|
||||||
|
*/
|
||||||
|
void partitions_optimizer_call_preparations(uint *num_used_parts,
|
||||||
|
uint *check_min_num,
|
||||||
|
uint *first);
|
||||||
|
ha_rows estimate_rows(bool is_records_in_range, uint inx,
|
||||||
|
key_range *min_key, key_range *max_key);
|
||||||
|
public:
|
||||||
|
|
||||||
/*
|
/*
|
||||||
keys_to_use_for_scanning can probably be implemented as the
|
keys_to_use_for_scanning can probably be implemented as the
|
||||||
intersection of all underlying handlers if mixed handlers are used.
|
intersection of all underlying handlers if mixed handlers are used.
|
||||||
|
24
sql/item.h
24
sql/item.h
@ -514,6 +514,13 @@ public:
|
|||||||
char * name; /* Name from select */
|
char * name; /* Name from select */
|
||||||
/* Original item name (if it was renamed)*/
|
/* Original item name (if it was renamed)*/
|
||||||
char * orig_name;
|
char * orig_name;
|
||||||
|
/**
|
||||||
|
Intrusive list pointer for free list. If not null, points to the next
|
||||||
|
Item on some Query_arena's free list. For instance, stored procedures
|
||||||
|
have their own Query_arena's.
|
||||||
|
|
||||||
|
@see Query_arena::free_list
|
||||||
|
*/
|
||||||
Item *next;
|
Item *next;
|
||||||
uint32 max_length;
|
uint32 max_length;
|
||||||
uint name_length; /* Length of name */
|
uint name_length; /* Length of name */
|
||||||
@ -987,6 +994,23 @@ public:
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
Find a function of a given type
|
||||||
|
|
||||||
|
@param arg the function type to search (enum Item_func::Functype)
|
||||||
|
@return
|
||||||
|
@retval TRUE the function type we're searching for is found
|
||||||
|
@retval FALSE the function type wasn't found
|
||||||
|
|
||||||
|
@description
|
||||||
|
This function can be used (together with Item::walk()) to find functions
|
||||||
|
in an item tree fragment.
|
||||||
|
*/
|
||||||
|
virtual bool find_function_processor (uchar *arg)
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
For SP local variable returns pointer to Item representing its
|
For SP local variable returns pointer to Item representing its
|
||||||
current value and pointer to current Item otherwise.
|
current value and pointer to current Item otherwise.
|
||||||
|
@ -4218,6 +4218,16 @@ Create_func_rand::create_native(THD *thd, LEX_STRING name,
|
|||||||
if (item_list != NULL)
|
if (item_list != NULL)
|
||||||
arg_count= item_list->elements;
|
arg_count= item_list->elements;
|
||||||
|
|
||||||
|
/*
|
||||||
|
When RAND() is binlogged, the seed is binlogged too. So the
|
||||||
|
sequence of random numbers is the same on a replication slave as
|
||||||
|
on the master. However, if several RAND() values are inserted
|
||||||
|
into a table, the order in which the rows are modified may differ
|
||||||
|
between master and slave, because the order is undefined. Hence,
|
||||||
|
the statement is unsafe to log in statement format.
|
||||||
|
*/
|
||||||
|
thd->lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_SYSTEM_FUNCTION);
|
||||||
|
|
||||||
switch (arg_count) {
|
switch (arg_count) {
|
||||||
case 0:
|
case 0:
|
||||||
{
|
{
|
||||||
|
@ -607,7 +607,7 @@ void Item_func::signal_divide_by_null()
|
|||||||
|
|
||||||
Item *Item_func::get_tmp_table_item(THD *thd)
|
Item *Item_func::get_tmp_table_item(THD *thd)
|
||||||
{
|
{
|
||||||
if (!with_sum_func && !const_item() && functype() != SUSERVAR_FUNC)
|
if (!with_sum_func && !const_item())
|
||||||
return new Item_field(result_field);
|
return new Item_field(result_field);
|
||||||
return copy_or_same(thd);
|
return copy_or_same(thd);
|
||||||
}
|
}
|
||||||
|
@ -215,6 +215,11 @@ public:
|
|||||||
{
|
{
|
||||||
return has_timestamp_args();
|
return has_timestamp_args();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
virtual bool find_function_processor (uchar *arg)
|
||||||
|
{
|
||||||
|
return functype() == *(Functype *) arg;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -677,8 +677,8 @@ String *Item_func_concat_ws::val_str(String *str)
|
|||||||
res->length() + sep_str->length() + res2->length())
|
res->length() + sep_str->length() + res2->length())
|
||||||
{
|
{
|
||||||
/* We have room in str; We can't get any errors here */
|
/* We have room in str; We can't get any errors here */
|
||||||
if (str == res2)
|
if (str->ptr() == res2->ptr())
|
||||||
{ // This is quote uncommon!
|
{ // This is quite uncommon!
|
||||||
str->replace(0,0,*sep_str);
|
str->replace(0,0,*sep_str);
|
||||||
str->replace(0,0,*res);
|
str->replace(0,0,*res);
|
||||||
}
|
}
|
||||||
|
@ -3275,7 +3275,18 @@ START SLAVE; . Query: '%s'", expected_error, thd->query());
|
|||||||
|
|
||||||
compare_errors:
|
compare_errors:
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
In the slave thread, we may sometimes execute some DROP / * 40005
|
||||||
|
TEMPORARY * / TABLE that come from parts of binlogs (likely if we
|
||||||
|
use RESET SLAVE or CHANGE MASTER TO), while the temporary table
|
||||||
|
has already been dropped. To ignore such irrelevant "table does
|
||||||
|
not exist errors", we silently clear the error if TEMPORARY was used.
|
||||||
|
*/
|
||||||
|
if (thd->lex->sql_command == SQLCOM_DROP_TABLE && thd->lex->drop_temporary &&
|
||||||
|
thd->is_error() && thd->stmt_da->sql_errno() == ER_BAD_TABLE_ERROR &&
|
||||||
|
!expected_error)
|
||||||
|
thd->stmt_da->reset_diagnostics_area();
|
||||||
|
/*
|
||||||
If we expected a non-zero error code, and we don't get the same error
|
If we expected a non-zero error code, and we don't get the same error
|
||||||
code, and it should be ignored or is related to a concurrency issue.
|
code, and it should be ignored or is related to a concurrency issue.
|
||||||
*/
|
*/
|
||||||
@ -8047,10 +8058,10 @@ Table_map_log_event::Table_map_log_event(THD *thd, TABLE *tbl, ulong tid,
|
|||||||
plus one or three bytes (see pack.c:net_store_length) for number of
|
plus one or three bytes (see pack.c:net_store_length) for number of
|
||||||
elements in the field metadata array.
|
elements in the field metadata array.
|
||||||
*/
|
*/
|
||||||
if (m_field_metadata_size > 255)
|
if (m_field_metadata_size < 251)
|
||||||
m_data_size+= m_field_metadata_size + 3;
|
|
||||||
else
|
|
||||||
m_data_size+= m_field_metadata_size + 1;
|
m_data_size+= m_field_metadata_size + 1;
|
||||||
|
else
|
||||||
|
m_data_size+= m_field_metadata_size + 3;
|
||||||
|
|
||||||
bzero(m_null_bits, num_null_bytes);
|
bzero(m_null_bits, num_null_bytes);
|
||||||
for (unsigned int i= 0 ; i < m_table->s->fields ; ++i)
|
for (unsigned int i= 0 ; i < m_table->s->fields ; ++i)
|
||||||
@ -8843,6 +8854,24 @@ static bool record_compare(TABLE *table)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
Check if we are using MyISAM.
|
||||||
|
|
||||||
|
If this is a myisam table, then we cannot do a memcmp
|
||||||
|
right away because some NULL fields can still contain
|
||||||
|
an old value in the row - they are not shown to the user
|
||||||
|
because the null bit is set, however, the contents are
|
||||||
|
not cleared. As such, plain memory comparison cannot be
|
||||||
|
assured to work. See: BUG#49482 and BUG#49481.
|
||||||
|
|
||||||
|
On top of this, we do not store field contents for null
|
||||||
|
fields in the binlog, so this is extra important when
|
||||||
|
comparing records fetched from binlog and from storage
|
||||||
|
engine.
|
||||||
|
*/
|
||||||
|
if (table->file->ht->db_type == DB_TYPE_MYISAM)
|
||||||
|
goto record_compare_field_by_field;
|
||||||
|
|
||||||
if (table->s->blob_fields + table->s->varchar_fields == 0)
|
if (table->s->blob_fields + table->s->varchar_fields == 0)
|
||||||
{
|
{
|
||||||
result= cmp_record(table,record[1]);
|
result= cmp_record(table,record[1]);
|
||||||
@ -8858,14 +8887,33 @@ static bool record_compare(TABLE *table)
|
|||||||
goto record_compare_exit;
|
goto record_compare_exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
record_compare_field_by_field:
|
||||||
|
|
||||||
/* Compare updated fields */
|
/* Compare updated fields */
|
||||||
for (Field **ptr=table->field ; *ptr ; ptr++)
|
for (Field **ptr=table->field ; *ptr ; ptr++)
|
||||||
{
|
{
|
||||||
if ((*ptr)->cmp_binary_offset(table->s->rec_buff_length))
|
Field *f= *ptr;
|
||||||
|
|
||||||
|
/* if just one of the fields is null then there is no match */
|
||||||
|
if ((f->is_null_in_record(table->record[0])) ==
|
||||||
|
!(f->is_null_in_record(table->record[1])))
|
||||||
{
|
{
|
||||||
result= TRUE;
|
result= TRUE;
|
||||||
goto record_compare_exit;
|
goto record_compare_exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* if both fields are not null then we can compare */
|
||||||
|
if (!(f->is_null_in_record(table->record[0])) &&
|
||||||
|
!(f->is_null_in_record(table->record[1])))
|
||||||
|
{
|
||||||
|
if (f->cmp_binary_offset(table->s->rec_buff_length))
|
||||||
|
{
|
||||||
|
result= TRUE;
|
||||||
|
goto record_compare_exit;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* if both fields are null then there is a match. compare next field */
|
||||||
}
|
}
|
||||||
|
|
||||||
record_compare_exit:
|
record_compare_exit:
|
||||||
|
@ -330,6 +330,24 @@ static bool record_compare(TABLE *table)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
Check if we are using MyISAM.
|
||||||
|
|
||||||
|
If this is a myisam table, then we cannot do a memcmp
|
||||||
|
right away because some NULL fields can still contain
|
||||||
|
an old value in the row - they are not shown to the user
|
||||||
|
because the null bit is set, however, the contents are
|
||||||
|
not cleared. As such, plain memory comparison cannot be
|
||||||
|
assured to work. See: BUG#49482 and BUG#49481.
|
||||||
|
|
||||||
|
On top of this, we do not store field contents for null
|
||||||
|
fields in the binlog, so this is extra important when
|
||||||
|
comparing records fetched from binlog and from storage
|
||||||
|
engine.
|
||||||
|
*/
|
||||||
|
if (table->file->ht->db_type == DB_TYPE_MYISAM)
|
||||||
|
goto record_compare_field_by_field;
|
||||||
|
|
||||||
if (table->s->blob_fields + table->s->varchar_fields == 0)
|
if (table->s->blob_fields + table->s->varchar_fields == 0)
|
||||||
{
|
{
|
||||||
result= cmp_record(table,record[1]);
|
result= cmp_record(table,record[1]);
|
||||||
@ -345,14 +363,33 @@ static bool record_compare(TABLE *table)
|
|||||||
goto record_compare_exit;
|
goto record_compare_exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
record_compare_field_by_field:
|
||||||
|
|
||||||
/* Compare updated fields */
|
/* Compare updated fields */
|
||||||
for (Field **ptr=table->field ; *ptr ; ptr++)
|
for (Field **ptr=table->field ; *ptr ; ptr++)
|
||||||
{
|
{
|
||||||
if ((*ptr)->cmp_binary_offset(table->s->rec_buff_length))
|
Field *f= *ptr;
|
||||||
|
|
||||||
|
/* if just one of the fields is null then there is no match */
|
||||||
|
if ((f->is_null_in_record(table->record[0])) ==
|
||||||
|
!(f->is_null_in_record(table->record[1])))
|
||||||
{
|
{
|
||||||
result= TRUE;
|
result= TRUE;
|
||||||
goto record_compare_exit;
|
goto record_compare_exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* if both fields are not null then we can compare */
|
||||||
|
if (!(f->is_null_in_record(table->record[0])) &&
|
||||||
|
!(f->is_null_in_record(table->record[1])))
|
||||||
|
{
|
||||||
|
if (f->cmp_binary_offset(table->s->rec_buff_length))
|
||||||
|
{
|
||||||
|
result= TRUE;
|
||||||
|
goto record_compare_exit;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* if both fields are null then there is a match. compare next field */
|
||||||
}
|
}
|
||||||
|
|
||||||
record_compare_exit:
|
record_compare_exit:
|
||||||
|
@ -2799,8 +2799,15 @@ sp_lex_keeper::reset_lex_and_exec_core(THD *thd, uint *nextp,
|
|||||||
m_lex->mark_as_requiring_prelocking(NULL);
|
m_lex->mark_as_requiring_prelocking(NULL);
|
||||||
}
|
}
|
||||||
thd->rollback_item_tree_changes();
|
thd->rollback_item_tree_changes();
|
||||||
/* Update the state of the active arena. */
|
/*
|
||||||
thd->stmt_arena->state= Query_arena::EXECUTED;
|
Update the state of the active arena if no errors on
|
||||||
|
open_tables stage.
|
||||||
|
*/
|
||||||
|
if (!res || !thd->is_error() ||
|
||||||
|
(thd->stmt_da->sql_errno() != ER_CANT_REOPEN_TABLE &&
|
||||||
|
thd->stmt_da->sql_errno() != ER_NO_SUCH_TABLE &&
|
||||||
|
thd->stmt_da->sql_errno() != ER_UPDATE_TABLE_USED))
|
||||||
|
thd->stmt_arena->state= Query_arena::EXECUTED;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Merge here with the saved parent's values
|
Merge here with the saved parent's values
|
||||||
|
@ -292,7 +292,7 @@ static my_bool acl_load(THD *thd, TABLE_LIST *tables)
|
|||||||
{
|
{
|
||||||
TABLE *table;
|
TABLE *table;
|
||||||
READ_RECORD read_record_info;
|
READ_RECORD read_record_info;
|
||||||
my_bool return_val= 1;
|
my_bool return_val= TRUE;
|
||||||
bool check_no_resolve= specialflag & SPECIAL_NO_RESOLVE;
|
bool check_no_resolve= specialflag & SPECIAL_NO_RESOLVE;
|
||||||
char tmp_name[NAME_LEN+1];
|
char tmp_name[NAME_LEN+1];
|
||||||
int password_length;
|
int password_length;
|
||||||
@ -605,7 +605,7 @@ static my_bool acl_load(THD *thd, TABLE_LIST *tables)
|
|||||||
init_check_host();
|
init_check_host();
|
||||||
|
|
||||||
initialized=1;
|
initialized=1;
|
||||||
return_val=0;
|
return_val= FALSE;
|
||||||
|
|
||||||
end:
|
end:
|
||||||
thd->variables.sql_mode= old_sql_mode;
|
thd->variables.sql_mode= old_sql_mode;
|
||||||
@ -656,7 +656,7 @@ my_bool acl_reload(THD *thd)
|
|||||||
DYNAMIC_ARRAY old_acl_hosts,old_acl_users,old_acl_dbs;
|
DYNAMIC_ARRAY old_acl_hosts,old_acl_users,old_acl_dbs;
|
||||||
MEM_ROOT old_mem;
|
MEM_ROOT old_mem;
|
||||||
bool old_initialized;
|
bool old_initialized;
|
||||||
my_bool return_val= 1;
|
my_bool return_val= TRUE;
|
||||||
DBUG_ENTER("acl_reload");
|
DBUG_ENTER("acl_reload");
|
||||||
|
|
||||||
if (thd->locked_tables)
|
if (thd->locked_tables)
|
||||||
@ -683,8 +683,13 @@ my_bool acl_reload(THD *thd)
|
|||||||
|
|
||||||
if (simple_open_n_lock_tables(thd, tables))
|
if (simple_open_n_lock_tables(thd, tables))
|
||||||
{
|
{
|
||||||
sql_print_error("Fatal error: Can't open and lock privilege tables: %s",
|
/*
|
||||||
thd->stmt_da->message());
|
Execution might have been interrupted; only print the error message
|
||||||
|
if an error condition has been raised.
|
||||||
|
*/
|
||||||
|
if (thd->stmt_da->is_error())
|
||||||
|
sql_print_error("Fatal error: Can't open and lock privilege tables: %s",
|
||||||
|
thd->stmt_da->message());
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -683,7 +683,11 @@ static bool write_execute_load_query_log_event(THD *thd, sql_exchange* ex,
|
|||||||
if (n++)
|
if (n++)
|
||||||
pfields.append(", ");
|
pfields.append(", ");
|
||||||
if (item->name)
|
if (item->name)
|
||||||
|
{
|
||||||
|
pfields.append("`");
|
||||||
pfields.append(item->name);
|
pfields.append(item->name);
|
||||||
|
pfields.append("`");
|
||||||
|
}
|
||||||
else
|
else
|
||||||
item->print(&pfields, QT_ORDINARY);
|
item->print(&pfields, QT_ORDINARY);
|
||||||
}
|
}
|
||||||
@ -703,7 +707,9 @@ static bool write_execute_load_query_log_event(THD *thd, sql_exchange* ex,
|
|||||||
val= lv++;
|
val= lv++;
|
||||||
if (n++)
|
if (n++)
|
||||||
pfields.append(", ");
|
pfields.append(", ");
|
||||||
|
pfields.append("`");
|
||||||
pfields.append(item->name);
|
pfields.append(item->name);
|
||||||
|
pfields.append("`");
|
||||||
pfields.append("=");
|
pfields.append("=");
|
||||||
val->print(&pfields, QT_ORDINARY);
|
val->print(&pfields, QT_ORDINARY);
|
||||||
}
|
}
|
||||||
|
@ -623,8 +623,10 @@ void free_items(Item *item)
|
|||||||
DBUG_VOID_RETURN;
|
DBUG_VOID_RETURN;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* This works because items are allocated with sql_alloc() */
|
/**
|
||||||
|
This works because items are allocated with sql_alloc().
|
||||||
|
@note The function also handles null pointers (empty list).
|
||||||
|
*/
|
||||||
void cleanup_items(Item *item)
|
void cleanup_items(Item *item)
|
||||||
{
|
{
|
||||||
DBUG_ENTER("cleanup_items");
|
DBUG_ENTER("cleanup_items");
|
||||||
@ -3282,17 +3284,6 @@ end_with_restore_list:
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/*
|
|
||||||
If this is a slave thread, we may sometimes execute some
|
|
||||||
DROP / * 40005 TEMPORARY * / TABLE
|
|
||||||
that come from parts of binlogs (likely if we use RESET SLAVE or CHANGE
|
|
||||||
MASTER TO), while the temporary table has already been dropped.
|
|
||||||
To not generate such irrelevant "table does not exist errors",
|
|
||||||
we silently add IF EXISTS if TEMPORARY was used.
|
|
||||||
*/
|
|
||||||
if (thd->slave_thread)
|
|
||||||
lex->drop_if_exists= 1;
|
|
||||||
|
|
||||||
/* So that DROP TEMPORARY TABLE gets to binlog at commit/rollback */
|
/* So that DROP TEMPORARY TABLE gets to binlog at commit/rollback */
|
||||||
thd->variables.option_bits|= OPTION_KEEP_LOG;
|
thd->variables.option_bits|= OPTION_KEEP_LOG;
|
||||||
}
|
}
|
||||||
@ -7001,7 +6992,10 @@ bool reload_acl_and_cache(THD *thd, ulong options, TABLE_LIST *tables,
|
|||||||
if (options & REFRESH_USER_RESOURCES)
|
if (options & REFRESH_USER_RESOURCES)
|
||||||
reset_mqh((LEX_USER *) NULL, 0); /* purecov: inspected */
|
reset_mqh((LEX_USER *) NULL, 0); /* purecov: inspected */
|
||||||
*write_to_binlog= tmp_write_to_binlog;
|
*write_to_binlog= tmp_write_to_binlog;
|
||||||
return result;
|
/*
|
||||||
|
If the query was killed then this function must fail.
|
||||||
|
*/
|
||||||
|
return result || thd->killed;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -917,11 +917,14 @@ impossible position";
|
|||||||
|
|
||||||
thd_proc_info(thd, "Finished reading one binlog; switching to next binlog");
|
thd_proc_info(thd, "Finished reading one binlog; switching to next binlog");
|
||||||
switch (mysql_bin_log.find_next_log(&linfo, 1)) {
|
switch (mysql_bin_log.find_next_log(&linfo, 1)) {
|
||||||
case LOG_INFO_EOF:
|
|
||||||
loop_breaker = (flags & BINLOG_DUMP_NON_BLOCK);
|
|
||||||
break;
|
|
||||||
case 0:
|
case 0:
|
||||||
break;
|
break;
|
||||||
|
case LOG_INFO_EOF:
|
||||||
|
if (mysql_bin_log.is_active(log_file_name))
|
||||||
|
{
|
||||||
|
loop_breaker = (flags & BINLOG_DUMP_NON_BLOCK);
|
||||||
|
break;
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
errmsg = "could not find next log";
|
errmsg = "could not find next log";
|
||||||
my_errno= ER_MASTER_FATAL_ERROR_READING_BINLOG;
|
my_errno= ER_MASTER_FATAL_ERROR_READING_BINLOG;
|
||||||
|
@ -522,7 +522,7 @@ JOIN::prepare(Item ***rref_pointer_array,
|
|||||||
thd->lex->allow_sum_func= save_allow_sum_func;
|
thd->lex->allow_sum_func= save_allow_sum_func;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!thd->lex->view_prepare_mode)
|
if (!thd->lex->view_prepare_mode && !(select_options & SELECT_DESCRIBE))
|
||||||
{
|
{
|
||||||
Item_subselect *subselect;
|
Item_subselect *subselect;
|
||||||
/* Is it subselect? */
|
/* Is it subselect? */
|
||||||
@ -7170,6 +7170,7 @@ static void update_depend_map(JOIN *join, ORDER *order)
|
|||||||
table_map depend_map;
|
table_map depend_map;
|
||||||
order->item[0]->update_used_tables();
|
order->item[0]->update_used_tables();
|
||||||
order->depend_map=depend_map=order->item[0]->used_tables();
|
order->depend_map=depend_map=order->item[0]->used_tables();
|
||||||
|
order->used= 0;
|
||||||
// Not item_sum(), RAND() and no reference to table outside of sub select
|
// Not item_sum(), RAND() and no reference to table outside of sub select
|
||||||
if (!(order->depend_map & (OUTER_REF_TABLE_BIT | RAND_TABLE_BIT))
|
if (!(order->depend_map & (OUTER_REF_TABLE_BIT | RAND_TABLE_BIT))
|
||||||
&& !order->item[0]->with_sum_func)
|
&& !order->item[0]->with_sum_func)
|
||||||
|
@ -264,8 +264,14 @@ bool servers_reload(THD *thd)
|
|||||||
|
|
||||||
if (simple_open_n_lock_tables(thd, tables))
|
if (simple_open_n_lock_tables(thd, tables))
|
||||||
{
|
{
|
||||||
sql_print_error("Can't open and lock privilege tables: %s",
|
/*
|
||||||
thd->stmt_da->message());
|
Execution might have been interrupted; only print the error message
|
||||||
|
if an error condition has been raised.
|
||||||
|
*/
|
||||||
|
if (thd->stmt_da->is_error())
|
||||||
|
sql_print_error("Can't open and lock privilege tables: %s",
|
||||||
|
thd->stmt_da->message());
|
||||||
|
return_val= FALSE;
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -335,6 +335,35 @@ bool st_select_lex_unit::prepare(THD *thd_arg, select_result *sel_result,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Disable the usage of fulltext searches in the last union branch.
|
||||||
|
This is a temporary 5.x limitation because of the way the fulltext
|
||||||
|
search functions are handled by the optimizer.
|
||||||
|
This is manifestation of the more general problems of "taking away"
|
||||||
|
parts of a SELECT statement post-fix_fields(). This is generally not
|
||||||
|
doable since various flags are collected in various places (e.g.
|
||||||
|
SELECT_LEX) that carry information about the presence of certain
|
||||||
|
expressions or constructs in the parts of the query.
|
||||||
|
When part of the query is taken away it's not clear how to "divide"
|
||||||
|
the meaning of these accumulated flags and what to carry over to the
|
||||||
|
recipient query (SELECT_LEX).
|
||||||
|
*/
|
||||||
|
if (global_parameters->ftfunc_list->elements &&
|
||||||
|
global_parameters->order_list.elements &&
|
||||||
|
global_parameters != fake_select_lex)
|
||||||
|
{
|
||||||
|
ORDER *ord;
|
||||||
|
Item_func::Functype ft= Item_func::FT_FUNC;
|
||||||
|
for (ord= (ORDER*)global_parameters->order_list.first; ord; ord= ord->next)
|
||||||
|
if ((*ord->item)->walk (&Item::find_function_processor, FALSE,
|
||||||
|
(uchar *) &ft))
|
||||||
|
{
|
||||||
|
my_error (ER_CANT_USE_OPTION_HERE, MYF(0), "MATCH()");
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
create_options= (first_sl->options | thd_arg->variables.option_bits |
|
create_options= (first_sl->options | thd_arg->variables.option_bits |
|
||||||
TMP_TABLE_ALL_COLUMNS);
|
TMP_TABLE_ALL_COLUMNS);
|
||||||
/*
|
/*
|
||||||
@ -669,7 +698,7 @@ bool st_select_lex_unit::cleanup()
|
|||||||
{
|
{
|
||||||
ORDER *ord;
|
ORDER *ord;
|
||||||
for (ord= (ORDER*)global_parameters->order_list.first; ord; ord= ord->next)
|
for (ord= (ORDER*)global_parameters->order_list.first; ord; ord= ord->next)
|
||||||
(*ord->item)->cleanup();
|
(*ord->item)->walk (&Item::cleanup_processor, 0, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -24,6 +24,7 @@
|
|||||||
#include "sp_head.h"
|
#include "sp_head.h"
|
||||||
#include "sql_trigger.h"
|
#include "sql_trigger.h"
|
||||||
#include "probes_mysql.h"
|
#include "probes_mysql.h"
|
||||||
|
#include "debug_sync.h"
|
||||||
|
|
||||||
/* Return 0 if row hasn't changed */
|
/* Return 0 if row hasn't changed */
|
||||||
|
|
||||||
@ -1137,8 +1138,11 @@ reopen_tables:
|
|||||||
items from 'fields' list, so the cleanup above is necessary to.
|
items from 'fields' list, so the cleanup above is necessary to.
|
||||||
*/
|
*/
|
||||||
cleanup_items(thd->free_list);
|
cleanup_items(thd->free_list);
|
||||||
|
cleanup_items(thd->stmt_arena->free_list);
|
||||||
close_tables_for_reopen(thd, &table_list);
|
close_tables_for_reopen(thd, &table_list);
|
||||||
|
|
||||||
|
DEBUG_SYNC(thd, "multi_update_reopen_tables");
|
||||||
|
|
||||||
goto reopen_tables;
|
goto reopen_tables;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -30,13 +30,13 @@ pkglib_LIBRARIES = libmystrings.a
|
|||||||
# Exact one of ASSEMBLER_X
|
# Exact one of ASSEMBLER_X
|
||||||
if ASSEMBLER_x86
|
if ASSEMBLER_x86
|
||||||
ASRCS = strings-x86.s longlong2str-x86.s my_strtoll10-x86.s
|
ASRCS = strings-x86.s longlong2str-x86.s my_strtoll10-x86.s
|
||||||
CSRCS = bfill.c bmove.c bmove512.c bchange.c strxnmov.c int2str.c str2int.c r_strinstr.c bcmp.c strtol.c strtoul.c strtoll.c strtoull.c llstr.c strnlen.c ctype.c ctype-simple.c ctype-mb.c ctype-big5.c ctype-cp932.c ctype-czech.c ctype-eucjpms.c ctype-euc_kr.c ctype-gb2312.c ctype-gbk.c ctype-sjis.c ctype-tis620.c ctype-ujis.c ctype-utf8.c ctype-ucs2.c ctype-uca.c ctype-win1250ch.c ctype-bin.c ctype-latin1.c my_vsnprintf.c xml.c decimal.c ctype-extra.c str_alloc.c longlong2str_asm.c my_strchr.c dtoa.c
|
CSRCS = bfill.c bmove.c bmove512.c bchange.c strxnmov.c int2str.c str2int.c r_strinstr.c bcmp.c strtol.c strtoul.c strtoll.c strtoull.c llstr.c strnlen.c ctype.c ctype-simple.c ctype-mb.c ctype-big5.c ctype-cp932.c ctype-czech.c ctype-eucjpms.c ctype-euc_kr.c ctype-gb2312.c ctype-gbk.c ctype-sjis.c ctype-tis620.c ctype-ujis.c ctype-utf8.c ctype-ucs2.c ctype-uca.c ctype-win1250ch.c ctype-bin.c ctype-latin1.c my_vsnprintf.c xml.c decimal.c ctype-extra.c str_alloc.c longlong2str_asm.c my_strchr.c dtoa.c strmov.c
|
||||||
else
|
else
|
||||||
if ASSEMBLER_sparc32
|
if ASSEMBLER_sparc32
|
||||||
# These file MUST all be on the same line!! Otherwise automake
|
# These file MUST all be on the same line!! Otherwise automake
|
||||||
# generats a very broken makefile
|
# generats a very broken makefile
|
||||||
ASRCS = bmove_upp-sparc.s strappend-sparc.s strend-sparc.s strinstr-sparc.s strmake-sparc.s strmov-sparc.s strnmov-sparc.s strstr-sparc.s
|
ASRCS = bmove_upp-sparc.s strappend-sparc.s strend-sparc.s strinstr-sparc.s strmake-sparc.s strmov-sparc.s strnmov-sparc.s strstr-sparc.s
|
||||||
CSRCS = strcont.c strfill.c strcend.c is_prefix.c longlong2str.c bfill.c bmove.c bmove512.c bchange.c strxnmov.c int2str.c str2int.c r_strinstr.c bcmp.c strtol.c strtoul.c strtoll.c strtoull.c llstr.c strnlen.c strxmov.c ctype.c ctype-simple.c ctype-mb.c ctype-big5.c ctype-cp932.c ctype-czech.c ctype-eucjpms.c ctype-euc_kr.c ctype-gb2312.c ctype-gbk.c ctype-sjis.c ctype-tis620.c ctype-ujis.c ctype-utf8.c ctype-ucs2.c ctype-uca.c ctype-win1250ch.c ctype-bin.c ctype-latin1.c my_vsnprintf.c xml.c decimal.c ctype-extra.c my_strtoll10.c str_alloc.c my_strchr.c dtoa.c
|
CSRCS = strcont.c strfill.c strcend.c is_prefix.c longlong2str.c bfill.c bmove.c bmove512.c bchange.c strxnmov.c int2str.c str2int.c r_strinstr.c bcmp.c strtol.c strtoul.c strtoll.c strtoull.c llstr.c strnlen.c strxmov.c ctype.c ctype-simple.c ctype-mb.c ctype-big5.c ctype-cp932.c ctype-czech.c ctype-eucjpms.c ctype-euc_kr.c ctype-gb2312.c ctype-gbk.c ctype-sjis.c ctype-tis620.c ctype-ujis.c ctype-utf8.c ctype-ucs2.c ctype-uca.c ctype-win1250ch.c ctype-bin.c ctype-latin1.c my_vsnprintf.c xml.c decimal.c ctype-extra.c my_strtoll10.c str_alloc.c my_strchr.c dtoa.c strmov.c
|
||||||
else
|
else
|
||||||
#no assembler
|
#no assembler
|
||||||
ASRCS =
|
ASRCS =
|
||||||
|
@ -24,13 +24,11 @@
|
|||||||
#include <my_global.h>
|
#include <my_global.h>
|
||||||
#include "m_string.h"
|
#include "m_string.h"
|
||||||
|
|
||||||
#ifdef BAD_STRING_COMPILER
|
#ifdef strmov
|
||||||
#undef strmov
|
#undef strmov
|
||||||
#define strmov strmov_overlapp
|
#define strmov strmov_overlapp
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef strmov
|
|
||||||
|
|
||||||
#if !defined(MC68000) && !defined(DS90)
|
#if !defined(MC68000) && !defined(DS90)
|
||||||
|
|
||||||
char *strmov(register char *dst, register const char *src)
|
char *strmov(register char *dst, register const char *src)
|
||||||
@ -53,5 +51,3 @@ char *strmov(dst, src)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif /* strmov */
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
# Copyright (C) 2000-2001, 2003-2006 MySQL AB
|
# Copyright (C) 2000-2006 MySQL AB, 2008-2010 Sun Microsystems, Inc.
|
||||||
#
|
#
|
||||||
# This library is free software; you can redistribute it and/or
|
# This library is free software; you can redistribute it and/or
|
||||||
# modify it under the terms of the GNU Library General Public
|
# modify it under the terms of the GNU Library General Public
|
||||||
@ -120,6 +120,7 @@ SUFFIXES = .sh
|
|||||||
-e 's!@''SHARED_LIB_VERSION''@!@SHARED_LIB_VERSION@!' \
|
-e 's!@''SHARED_LIB_VERSION''@!@SHARED_LIB_VERSION@!' \
|
||||||
-e 's!@''MYSQL_BASE_VERSION''@!@MYSQL_BASE_VERSION@!' \
|
-e 's!@''MYSQL_BASE_VERSION''@!@MYSQL_BASE_VERSION@!' \
|
||||||
-e 's!@''MYSQL_NO_DASH_VERSION''@!@MYSQL_NO_DASH_VERSION@!' \
|
-e 's!@''MYSQL_NO_DASH_VERSION''@!@MYSQL_NO_DASH_VERSION@!' \
|
||||||
|
-e 's!@''MYSQL_U_SCORE_VERSION''@!@MYSQL_U_SCORE_VERSION@!' \
|
||||||
-e 's!@''MYSQL_COPYRIGHT_YEAR''@!@MYSQL_COPYRIGHT_YEAR@!' \
|
-e 's!@''MYSQL_COPYRIGHT_YEAR''@!@MYSQL_COPYRIGHT_YEAR@!' \
|
||||||
-e 's!@''MYSQL_TCP_PORT''@!@MYSQL_TCP_PORT@!' \
|
-e 's!@''MYSQL_TCP_PORT''@!@MYSQL_TCP_PORT@!' \
|
||||||
-e 's!@''PERL_DBI_VERSION''@!@PERL_DBI_VERSION@!' \
|
-e 's!@''PERL_DBI_VERSION''@!@PERL_DBI_VERSION@!' \
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
# Copyright 2003-2008 MySQL AB, 2009 Sun Microsystems, Inc.
|
||||||
#
|
#
|
||||||
# MySQL-shared-compat.spec
|
# MySQL-shared-compat.spec
|
||||||
#
|
#
|
||||||
@ -7,8 +8,6 @@
|
|||||||
# separate "MySQL-shared" package. This spec file simply repackages two
|
# separate "MySQL-shared" package. This spec file simply repackages two
|
||||||
# already existing MySQL-shared RPMs into a single package.
|
# already existing MySQL-shared RPMs into a single package.
|
||||||
#
|
#
|
||||||
# Copyright (C) 2003 MySQL AB
|
|
||||||
#
|
|
||||||
# This program is free software; you can redistribute it and/or modify it
|
# This program is free software; you can redistribute it and/or modify it
|
||||||
# under the terms of the GNU General Public License as published by the Free
|
# under the terms of the GNU General Public License as published by the Free
|
||||||
# Software Foundation; version 2 of the License.
|
# Software Foundation; version 2 of the License.
|
||||||
@ -28,27 +27,27 @@
|
|||||||
#
|
#
|
||||||
# Change this to match the version of the shared libs you want to include
|
# Change this to match the version of the shared libs you want to include
|
||||||
#
|
#
|
||||||
%define version50 @MYSQL_NO_DASH_VERSION@
|
%define version_cur @MYSQL_U_SCORE_VERSION@
|
||||||
%define version41 4.1.17
|
%define version41 4.1.17
|
||||||
%define version40 4.0.26
|
%define version40 4.0.26
|
||||||
%define version3 3.23.58
|
%define version3 3.23.58
|
||||||
|
|
||||||
Name: MySQL-shared-compat
|
Name: MySQL-shared-compat
|
||||||
Packager: MySQL Product Engineering team <build@mysql.com>
|
Packager: Sun Microsystems, Inc. Product Engineering Team <build@mysql.com>
|
||||||
Vendor: MySQL AB
|
Vendor: Sun Microsystems, Inc.
|
||||||
License: GPL
|
License: GPL
|
||||||
Group: Applications/Databases
|
Group: Applications/Databases
|
||||||
URL: http://www.mysql.com/
|
URL: http://www.mysql.com/
|
||||||
Autoreqprov: on
|
Autoreqprov: on
|
||||||
Version: %{version50}
|
Version: %{version_cur}
|
||||||
Release: 0
|
Release: 1
|
||||||
BuildRoot: %{_tmppath}/%{name}-%{version}-build
|
BuildRoot: %{_tmppath}/%{name}-%{version}-build
|
||||||
Obsoletes: MySQL-shared, mysql-shared
|
Obsoletes: MySQL-shared, mysql-shared
|
||||||
Provides: MySQL-shared
|
Provides: MySQL-shared
|
||||||
Summary: MySQL shared client libraries for MySQL %{version}, %{version41}, %{version40} and %{version3}
|
Summary: MySQL shared client libraries for MySQL %{version}, %{version41}, %{version40} and %{version3}
|
||||||
# We simply use the "MySQL-shared" subpackages as input sources instead of
|
# We simply use the "MySQL-shared" subpackages as input sources instead of
|
||||||
# rebuilding all from source
|
# rebuilding all from source
|
||||||
Source0: MySQL-shared-%{version50}-0.%{_arch}.rpm
|
Source0: MySQL-shared-%{version_cur}-1.%{_arch}.rpm
|
||||||
Source1: MySQL-shared-%{version41}-1.%{_arch}.rpm
|
Source1: MySQL-shared-%{version41}-1.%{_arch}.rpm
|
||||||
Source2: MySQL-shared-%{version40}-0.%{_arch}.rpm
|
Source2: MySQL-shared-%{version40}-0.%{_arch}.rpm
|
||||||
Source3: MySQL-shared-%{version3}-1.%{_arch}.rpm
|
Source3: MySQL-shared-%{version3}-1.%{_arch}.rpm
|
||||||
@ -62,7 +61,7 @@ BuildRoot: %{_tmppath}/%{name}-%{version}-build
|
|||||||
|
|
||||||
%description
|
%description
|
||||||
This package includes the shared libraries for MySQL %{version3},
|
This package includes the shared libraries for MySQL %{version3},
|
||||||
MySQL %{version40}, %{version41} as well as MySQL %{version50}.
|
MySQL %{version40}, %{version41} as well as MySQL %{version_cur}.
|
||||||
Install this package instead of "MySQL-shared", if you have applications
|
Install this package instead of "MySQL-shared", if you have applications
|
||||||
installed that are dynamically linked against older versions of the MySQL
|
installed that are dynamically linked against older versions of the MySQL
|
||||||
client library but you want to upgrade to MySQL %{version} without breaking the
|
client library but you want to upgrade to MySQL %{version} without breaking the
|
||||||
@ -84,3 +83,14 @@ rpm2cpio %{SOURCE3} | cpio -iv --make-directories
|
|||||||
%files
|
%files
|
||||||
%defattr(-, root, root)
|
%defattr(-, root, root)
|
||||||
%{_libdir}/libmysqlclient*
|
%{_libdir}/libmysqlclient*
|
||||||
|
|
||||||
|
# The spec file changelog only includes changes made to the spec file
|
||||||
|
# itself - note that they must be ordered by date (important when
|
||||||
|
# merging BK trees)
|
||||||
|
%changelog
|
||||||
|
* Tue Dec 22 2009 Joerg Bruehe <joerg.bruehe@sun.com>
|
||||||
|
|
||||||
|
- Change RPM file naming:
|
||||||
|
- Suffix like "-m2", "-rc" becomes part of version as "_m2", "_rc".
|
||||||
|
- Release counts from 1, not 0.
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
# Copyright 2000-2008 MySQL AB, 2008 Sun Microsystems, Inc.
|
# Copyright (C) 2000-2008 MySQL AB, 2008-2010 Sun Microsystems, Inc.
|
||||||
#
|
#
|
||||||
# This program is free software; you can redistribute it and/or modify
|
# This program is free software; you can redistribute it and/or modify
|
||||||
# it under the terms of the GNU General Public License as published by
|
# it under the terms of the GNU General Public License as published by
|
||||||
@ -50,9 +50,9 @@
|
|||||||
%{!?malloc_lib_target:%define WITH_TCMALLOC 0}
|
%{!?malloc_lib_target:%define WITH_TCMALLOC 0}
|
||||||
|
|
||||||
%if %{STATIC_BUILD}
|
%if %{STATIC_BUILD}
|
||||||
%define release 0
|
%define release 1
|
||||||
%else
|
%else
|
||||||
%define release 0.glibc23
|
%define release 1.glibc23
|
||||||
%endif
|
%endif
|
||||||
%define mysql_license GPL
|
%define mysql_license GPL
|
||||||
%define mysqld_user mysql
|
%define mysqld_user mysql
|
||||||
@ -64,6 +64,19 @@
|
|||||||
# See BUG#998 for details.
|
# See BUG#998 for details.
|
||||||
%define _unpackaged_files_terminate_build 0
|
%define _unpackaged_files_terminate_build 0
|
||||||
|
|
||||||
|
# ------------------------------------------------------------------------------
|
||||||
|
# RPM build tools now automatically detects Perl module dependencies. This
|
||||||
|
# detection gives problems as it is broken in some versions, and it also
|
||||||
|
# give unwanted dependencies from mandatory scripts in our package.
|
||||||
|
# Might not be possible to disable in all RPM tool versions, but here we
|
||||||
|
# try. We keep the "AutoReqProv: no" for the "test" sub package, as disabling
|
||||||
|
# here might fail, and that package has the most problems.
|
||||||
|
# See http://fedoraproject.org/wiki/Packaging/Perl#Filtering_Requires:_and_Provides
|
||||||
|
# http://www.wideopen.com/archives/rpm-list/2002-October/msg00343.html
|
||||||
|
# ------------------------------------------------------------------------------
|
||||||
|
%undefine __perl_provides
|
||||||
|
%undefine __perl_requires
|
||||||
|
|
||||||
%define see_base For a description of MySQL see the base MySQL RPM or http://www.mysql.com
|
%define see_base For a description of MySQL see the base MySQL RPM or http://www.mysql.com
|
||||||
|
|
||||||
# On SuSE 9 no separate "debuginfo" package is built. To enable basic
|
# On SuSE 9 no separate "debuginfo" package is built. To enable basic
|
||||||
@ -86,7 +99,7 @@
|
|||||||
Name: MySQL
|
Name: MySQL
|
||||||
Summary: MySQL: a very fast and reliable SQL database server
|
Summary: MySQL: a very fast and reliable SQL database server
|
||||||
Group: Applications/Databases
|
Group: Applications/Databases
|
||||||
Version: @MYSQL_NO_DASH_VERSION@
|
Version: @MYSQL_U_SCORE_VERSION@
|
||||||
Release: %{release}
|
Release: %{release}
|
||||||
License: Copyright 2000-2008 MySQL AB, @MYSQL_COPYRIGHT_YEAR@ Sun Microsystems, Inc. All rights reserved. Use is subject to license terms. Under %{mysql_license} license as shown in the Description field.
|
License: Copyright 2000-2008 MySQL AB, @MYSQL_COPYRIGHT_YEAR@ Sun Microsystems, Inc. All rights reserved. Use is subject to license terms. Under %{mysql_license} license as shown in the Description field.
|
||||||
Source: http://www.mysql.com/Downloads/MySQL-@MYSQL_BASE_VERSION@/mysql-%{mysql_version}.tar.gz
|
Source: http://www.mysql.com/Downloads/MySQL-@MYSQL_BASE_VERSION@/mysql-%{mysql_version}.tar.gz
|
||||||
@ -204,7 +217,7 @@ They should be used with caution.
|
|||||||
%endif
|
%endif
|
||||||
|
|
||||||
%package test
|
%package test
|
||||||
Requires: %{name}-client perl-DBI perl
|
Requires: %{name}-client perl
|
||||||
Summary: MySQL - Test suite
|
Summary: MySQL - Test suite
|
||||||
Group: Applications/Databases
|
Group: Applications/Databases
|
||||||
Provides: mysql-test
|
Provides: mysql-test
|
||||||
@ -673,7 +686,7 @@ fi
|
|||||||
%doc %attr(644, root, man) %{_mandir}/man8/mysqld.8*
|
%doc %attr(644, root, man) %{_mandir}/man8/mysqld.8*
|
||||||
%doc %attr(644, root, man) %{_mandir}/man1/mysqld_multi.1*
|
%doc %attr(644, root, man) %{_mandir}/man1/mysqld_multi.1*
|
||||||
%doc %attr(644, root, man) %{_mandir}/man1/mysqld_safe.1*
|
%doc %attr(644, root, man) %{_mandir}/man1/mysqld_safe.1*
|
||||||
%doc %attr(644, root, man) %{_mandir}/man1/mysql_fix_privilege_tables.1*
|
#%doc %attr(644, root, man) %{_mandir}/man1/mysql_fix_privilege_tables.1*
|
||||||
%doc %attr(644, root, man) %{_mandir}/man1/mysql_install_db.1*
|
%doc %attr(644, root, man) %{_mandir}/man1/mysql_install_db.1*
|
||||||
%doc %attr(644, root, man) %{_mandir}/man1/mysql_upgrade.1*
|
%doc %attr(644, root, man) %{_mandir}/man1/mysql_upgrade.1*
|
||||||
%doc %attr(644, root, man) %{_mandir}/man1/mysqlhotcopy.1*
|
%doc %attr(644, root, man) %{_mandir}/man1/mysqlhotcopy.1*
|
||||||
@ -715,8 +728,8 @@ fi
|
|||||||
%attr(755, root, root) %{_bindir}/resolveip
|
%attr(755, root, root) %{_bindir}/resolveip
|
||||||
|
|
||||||
%attr(755, root, root) %{_libdir}/mysql/plugin/ha_example.so*
|
%attr(755, root, root) %{_libdir}/mysql/plugin/ha_example.so*
|
||||||
%attr(755, root, root) %{_libdir}/mysql/plugin/libsemisync_master.so*
|
%attr(755, root, root) %{_libdir}/mysql/plugin/semisync_master.so*
|
||||||
%attr(755, root, root) %{_libdir}/mysql/plugin/libsemisync_slave.so*
|
%attr(755, root, root) %{_libdir}/mysql/plugin/semisync_slave.so*
|
||||||
|
|
||||||
%if %{WITH_TCMALLOC}
|
%if %{WITH_TCMALLOC}
|
||||||
%attr(755, root, root) %{_libdir}/mysql/%{malloc_lib_target}
|
%attr(755, root, root) %{_libdir}/mysql/%{malloc_lib_target}
|
||||||
@ -849,10 +862,10 @@ fi
|
|||||||
%{_libdir}/mysql/libz.la
|
%{_libdir}/mysql/libz.la
|
||||||
%{_libdir}/mysql/plugin/ha_example.a
|
%{_libdir}/mysql/plugin/ha_example.a
|
||||||
%{_libdir}/mysql/plugin/ha_example.la
|
%{_libdir}/mysql/plugin/ha_example.la
|
||||||
%{_libdir}/mysql/plugin/libsemisync_master.a
|
%{_libdir}/mysql/plugin/semisync_master.a
|
||||||
%{_libdir}/mysql/plugin/libsemisync_master.la
|
%{_libdir}/mysql/plugin/semisync_master.la
|
||||||
%{_libdir}/mysql/plugin/libsemisync_slave.a
|
%{_libdir}/mysql/plugin/semisync_slave.a
|
||||||
%{_libdir}/mysql/plugin/libsemisync_slave.la
|
%{_libdir}/mysql/plugin/semisync_slave.la
|
||||||
|
|
||||||
%files shared
|
%files shared
|
||||||
%defattr(-, root, root, 0755)
|
%defattr(-, root, root, 0755)
|
||||||
@ -882,6 +895,20 @@ fi
|
|||||||
# itself - note that they must be ordered by date (important when
|
# itself - note that they must be ordered by date (important when
|
||||||
# merging BK trees)
|
# merging BK trees)
|
||||||
%changelog
|
%changelog
|
||||||
|
* Mon Jan 11 2010 Joerg Bruehe <joerg.bruehe@sun.com>
|
||||||
|
|
||||||
|
- Change RPM file naming:
|
||||||
|
- Suffix like "-m2", "-rc" becomes part of version as "_m2", "_rc".
|
||||||
|
- Release counts from 1, not 0.
|
||||||
|
|
||||||
|
* Wed Dec 23 2009 Joerg Bruehe <joerg.bruehe@sun.com>
|
||||||
|
|
||||||
|
- The "semisync" plugin file name has lost its introductory "lib",
|
||||||
|
adapt the file lists for the subpackages.
|
||||||
|
This is a part missing from the fix for bug#48351.
|
||||||
|
- Remove the "fix_privilege_tables" manual, it does not exist in 5.5
|
||||||
|
(and likely, the whole script will go, too).
|
||||||
|
|
||||||
* Mon Nov 16 2009 Joerg Bruehe <joerg.bruehe@sun.com>
|
* Mon Nov 16 2009 Joerg Bruehe <joerg.bruehe@sun.com>
|
||||||
|
|
||||||
- Fix some problems with the directives around "tcmalloc" (experimental),
|
- Fix some problems with the directives around "tcmalloc" (experimental),
|
||||||
|
Loading…
x
Reference in New Issue
Block a user