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
|
||||
{
|
||||
// Remove the backslash
|
||||
strmov(ptr, ptr+1);
|
||||
strmov_overlapp(ptr, ptr+1);
|
||||
}
|
||||
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
|
||||
# We take some made up examples
|
||||
#
|
||||
# VERSION 5.1.40sp1-alpha 5.0.34a
|
||||
# MYSQL_NO_DASH_VERSION 5.1.40sp1 5.0.34a
|
||||
# MYSQL_NUMERIC_VERSION 5.1.40 5.0.34
|
||||
# MYSQL_BASE_VERSION 5.1 5.0
|
||||
# MYSQL_VERSION_ID 50140 50034
|
||||
# VERSION 5.1.40sp1-alpha 5.0.34a 5.5.1-m2
|
||||
# MYSQL_U_SCORE_VERSION 5.1.40sp1_alpha 5.0.34a 5.5.1_m2
|
||||
# MYSQL_NO_DASH_VERSION 5.1.40sp1 5.0.34a 5.5.1
|
||||
# MYSQL_NUMERIC_VERSION 5.1.40 5.0.34 5.5.1
|
||||
# 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_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|\.[[^.]]*$||"`
|
||||
@ -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_BASE_VERSION)
|
||||
AC_SUBST(MYSQL_VERSION_ID)
|
||||
|
@ -305,6 +305,7 @@ private:
|
||||
bool ValidateSignature(SignerList*);
|
||||
bool ConfirmSignature(Source&);
|
||||
void GetKey();
|
||||
char* AddTag(char*, const char*, const char*, word32, word32);
|
||||
void GetName(NameType);
|
||||
void GetValidity();
|
||||
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
|
||||
void CertDecoder::GetName(NameType nt)
|
||||
{
|
||||
@ -659,11 +676,21 @@ void CertDecoder::GetName(NameType nt)
|
||||
|
||||
SHA sha;
|
||||
word32 length = GetSequence(); // length of all distinguished names
|
||||
assert (length < ASN_NAME_MAX);
|
||||
|
||||
if (length >= ASN_NAME_MAX)
|
||||
goto err;
|
||||
length += source_.get_index();
|
||||
|
||||
char* ptr = (nt == ISSUER) ? issuer_ : subject_;
|
||||
word32 idx = 0;
|
||||
char *ptr, *buf_end;
|
||||
|
||||
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) {
|
||||
GetSet();
|
||||
@ -685,47 +712,36 @@ void CertDecoder::GetName(NameType nt)
|
||||
byte id = source_.next();
|
||||
b = source_.next(); // strType
|
||||
word32 strLen = GetLength(source_);
|
||||
bool copy = false;
|
||||
|
||||
if (id == COMMON_NAME) {
|
||||
memcpy(&ptr[idx], "/CN=", 4);
|
||||
idx += 4;
|
||||
copy = true;
|
||||
}
|
||||
else if (id == SUR_NAME) {
|
||||
memcpy(&ptr[idx], "/SN=", 4);
|
||||
idx += 4;
|
||||
copy = true;
|
||||
}
|
||||
else if (id == COUNTRY_NAME) {
|
||||
memcpy(&ptr[idx], "/C=", 3);
|
||||
idx += 3;
|
||||
copy = true;
|
||||
}
|
||||
else if (id == LOCALITY_NAME) {
|
||||
memcpy(&ptr[idx], "/L=", 3);
|
||||
idx += 3;
|
||||
copy = true;
|
||||
}
|
||||
else if (id == STATE_NAME) {
|
||||
memcpy(&ptr[idx], "/ST=", 4);
|
||||
idx += 4;
|
||||
copy = true;
|
||||
}
|
||||
else if (id == ORG_NAME) {
|
||||
memcpy(&ptr[idx], "/O=", 3);
|
||||
idx += 3;
|
||||
copy = true;
|
||||
}
|
||||
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;
|
||||
switch (id) {
|
||||
case COMMON_NAME:
|
||||
if (!(ptr= AddTag(ptr, buf_end, "/CN=", 4, strLen)))
|
||||
goto err;
|
||||
break;
|
||||
case SUR_NAME:
|
||||
if (!(ptr= AddTag(ptr, buf_end, "/SN=", 4, strLen)))
|
||||
goto err;
|
||||
break;
|
||||
case COUNTRY_NAME:
|
||||
if (!(ptr= AddTag(ptr, buf_end, "/C=", 3, strLen)))
|
||||
goto err;
|
||||
break;
|
||||
case LOCALITY_NAME:
|
||||
if (!(ptr= AddTag(ptr, buf_end, "/L=", 3, strLen)))
|
||||
goto err;
|
||||
break;
|
||||
case STATE_NAME:
|
||||
if (!(ptr= AddTag(ptr, buf_end, "/ST=", 4, strLen)))
|
||||
goto err;
|
||||
break;
|
||||
case ORG_NAME:
|
||||
if (!(ptr= AddTag(ptr, buf_end, "/O=", 3, strLen)))
|
||||
goto err;
|
||||
break;
|
||||
case ORGUNIT_NAME:
|
||||
if (!(ptr= AddTag(ptr, buf_end, "/OU=", 4, strLen)))
|
||||
goto err;
|
||||
break;
|
||||
}
|
||||
|
||||
sha.Update(source_.get_current(), strLen);
|
||||
@ -739,23 +755,20 @@ void CertDecoder::GetName(NameType nt)
|
||||
source_.advance(oidSz + 1);
|
||||
word32 length = GetLength(source_);
|
||||
|
||||
if (email) {
|
||||
memcpy(&ptr[idx], "/emailAddress=", 14);
|
||||
idx += 14;
|
||||
|
||||
memcpy(&ptr[idx], source_.get_current(), length);
|
||||
idx += length;
|
||||
}
|
||||
if (email && !(ptr= AddTag(ptr, buf_end, "/emailAddress=", 14, length)))
|
||||
goto err;
|
||||
|
||||
source_.advance(length);
|
||||
}
|
||||
}
|
||||
ptr[idx++] = 0;
|
||||
*ptr= 0;
|
||||
|
||||
if (nt == ISSUER)
|
||||
sha.Final(issuerHash_);
|
||||
else
|
||||
sha.Final(subjectHash_);
|
||||
sha.Final(nt == ISSUER ? issuerHash_ : subjectHash_);
|
||||
|
||||
return;
|
||||
|
||||
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_lower[];
|
||||
|
||||
#ifdef BAD_STRING_COMPILER
|
||||
#define strmov(A,B) (memccpy(A,B,0,INT_MAX)-1)
|
||||
#else
|
||||
#ifndef strmov
|
||||
#define strmov_overlapp(A,B) strmov(A,B)
|
||||
#define strmake_overlapp(A,B,C) strmake(A,B,C)
|
||||
#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 char *strkey(char *dst,char *head,char *tail,char *flags);
|
||||
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
|
||||
extern char *strmov(char *dst,const char *src);
|
||||
#else
|
||||
extern char *strmov_overlapp(char *dst,const char *src);
|
||||
#endif
|
||||
extern char *strnmov(char *dst,const char *src,size_t n);
|
||||
extern char *strsuff(const char *src,const char *suffix);
|
||||
|
@ -237,4 +237,18 @@ source include/diff_tables.inc;
|
||||
|
||||
-- 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
|
||||
|
@ -15,6 +15,8 @@
|
||||
# Vs slave. #
|
||||
#############################################################################
|
||||
|
||||
CALL mtr.add_suppression('Statement may not be safe to log in statement format.');
|
||||
|
||||
# Begin clean up test section
|
||||
connection master;
|
||||
--disable_warnings
|
||||
@ -39,12 +41,16 @@ RETURN tmp;
|
||||
END|
|
||||
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());
|
||||
--enable_warnings
|
||||
|
||||
SET AUTOCOMMIT=0;
|
||||
START TRANSACTION;
|
||||
--disable_warnings
|
||||
INSERT INTO test.t1 VALUES (null,test.f1());
|
||||
--enable_warnings
|
||||
ROLLBACK;
|
||||
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
|
||||
info: Records: 0 Duplicates: 0 Warnings: 0
|
||||
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
|
||||
CREATE TABLE t1(c CHAR(10),
|
||||
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
|
||||
007 Berkeley Berkeley Public1 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;
|
||||
create table t1 (f1 int);
|
||||
insert into t1 values (1);
|
||||
|
@ -126,7 +126,7 @@ group by
|
||||
a.text, b.id, b.betreff
|
||||
order by
|
||||
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
|
||||
from
|
||||
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)
|
||||
order by
|
||||
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
|
||||
from
|
||||
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)
|
||||
order by
|
||||
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)
|
||||
order by match(betreff) against ('+abc' in boolean mode) desc;
|
||||
|
@ -1,4 +1,5 @@
|
||||
DROP TABLE IF EXISTS t1;
|
||||
DROP PROCEDURE IF EXISTS p1;
|
||||
CREATE TABLE t1 ( number INT NOT NULL, alpha CHAR(6) NOT NULL );
|
||||
INSERT INTO t1 VALUES (1413006,'idlfmv'),
|
||||
(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 t1 eq_ref PRIMARY,a PRIMARY 318 func,const,const 1
|
||||
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
|
||||
|
@ -1942,6 +1942,28 @@ execute stmt;
|
||||
deallocate prepare stmt;
|
||||
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.
|
||||
create procedure proc_1() reset query cache;
|
||||
call proc_1();
|
||||
|
@ -6929,6 +6929,22 @@ CALL p1();
|
||||
CALL p1();
|
||||
DROP PROCEDURE p1;
|
||||
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'
|
||||
# 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 DUMPFILE 'union.out.file4' FROM 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
|
||||
2 3
|
||||
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
|
||||
CREATE TABLE t1 (i INT);
|
||||
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
|
||||
master-bin.000001 # Query # # BEGIN
|
||||
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
|
||||
select
|
||||
(@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 # # BEGIN
|
||||
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 # # use `test`; alter table t1 add b int
|
||||
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 # Begin_load_query # # ;file_id=#;block_len=#
|
||||
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
|
||||
/* the output must denote there is the query */;
|
||||
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 # Intvar # # INSERT_ID=10
|
||||
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
|
||||
drop trigger trg_del_t2;
|
||||
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.
|
||||
INSERT INTO t1 VALUES (VERSION());
|
||||
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;
|
||||
SET TIMESTAMP=1000000;
|
||||
INSERT INTO t1 VALUES
|
||||
|
@ -77,7 +77,8 @@
|
||||
# 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#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 ====
|
||||
#
|
||||
@ -646,6 +647,7 @@ DROP TABLE t1,t2,t3;
|
||||
|
||||
#
|
||||
# BUG#47995: Mark user functions as unsafe
|
||||
# BUG#49222: Mare RAND() unsafe
|
||||
#
|
||||
# Test that the system functions that are supposed to be marked unsafe
|
||||
# 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));
|
||||
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 (GET_LOCK('tmp', 1));
|
||||
INSERT INTO t1 VALUES (IS_FREE_LOCK('tmp'));
|
||||
INSERT INTO t1 VALUES (IS_USED_LOCK('tmp'));
|
||||
INSERT INTO t1 VALUES (LOAD_FILE('../../std_data/words2.dat')); #marked unsafe before BUG#47995
|
||||
INSERT INTO t1 VALUES (GET_LOCK('tmp', 1)); #marked unsafe in BUG#47995
|
||||
INSERT INTO t1 VALUES (IS_FREE_LOCK('tmp')); #marked unsafe in BUG#47995
|
||||
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 in BUG#39701
|
||||
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 (SESSION_USER()); #marked unsafe before BUG#47995
|
||||
INSERT INTO t1 VALUES (SLEEP(1));
|
||||
INSERT INTO t1 VALUES (SYSDATE());
|
||||
INSERT INTO t1 VALUES (SLEEP(1)); #marked unsafe in BUG#47995
|
||||
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 (USER()); #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 (VERSION());
|
||||
INSERT INTO t1 VALUES (VERSION()); #marked unsafe in BUG#47995
|
||||
INSERT INTO t1 VALUES (RAND()); #marked unsafe in BUG#49222
|
||||
DELETE FROM t1;
|
||||
|
||||
# Since we replicate the TIMESTAMP variable, functions affected by the
|
||||
# TIMESTAMP variable are safe to replicate. So we check that the
|
||||
# following following functions depend on the TIMESTAMP variable and
|
||||
# don't generate a warning.
|
||||
# following following functions that depend on the TIMESTAMP variable
|
||||
# are not unsafe and don't generate a warning.
|
||||
|
||||
SET TIMESTAMP=1000000;
|
||||
INSERT INTO t1 VALUES
|
||||
|
@ -12,3 +12,17 @@ show status like 'Slave_open_temp_tables';
|
||||
Variable_name Value
|
||||
Slave_open_temp_tables 0
|
||||
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 # Query 1 # BEGIN
|
||||
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 # Query 1 # BEGIN
|
||||
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
|
||||
DROP DATABASE b48297_db1;
|
||||
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 # 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
|
||||
==== Verify results 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;
|
||||
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
|
||||
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));
|
||||
insert into t1 values(1, connection_id(), 0, 0, "");
|
||||
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;
|
||||
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
|
||||
start slave;
|
||||
CALL mtr.add_suppression('Statement may not be safe to log in statement format.');
|
||||
CREATE TABLE t1 (a VARCHAR(1000));
|
||||
INSERT INTO t1 VALUES (CONNECTION_ID());
|
||||
INSERT INTO t1 VALUES (CONNECTION_ID());
|
||||
|
@ -4,6 +4,7 @@ reset master;
|
||||
reset slave;
|
||||
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
|
||||
start slave;
|
||||
CALL mtr.add_suppression('Statement may not be safe to log in statement format.');
|
||||
DROP FUNCTION IF EXISTS test.f1;
|
||||
DROP TABLE IF EXISTS test.t1;
|
||||
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`;
|
||||
### TABLE with field_metadata_size == 290
|
||||
CREATE TABLE `t1` (
|
||||
`c1` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`c2` varchar(30) NOT NULL,
|
||||
@ -150,7 +156,51 @@ CREATE TABLE `t1` (
|
||||
PRIMARY KEY (`c1`)
|
||||
) ENGINE=InnoDB;
|
||||
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');
|
||||
DROP TABLE `t1`;
|
||||
INSERT INTO `t1`(c2) VALUES ('1');
|
||||
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.
|
||||
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 # # BEGIN
|
||||
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 # # BEGIN
|
||||
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
|
||||
DROP TABLE t1;
|
||||
stop slave;
|
||||
@ -131,3 +131,20 @@ use b48297_db1;
|
||||
Comparing tables master:b48297_db1.t1 and slave:b48297_db1.t1
|
||||
DROP DATABASE b48297_db1;
|
||||
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 # BEGIN
|
||||
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
|
||||
show binlog events from 107 limit 1;
|
||||
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 # # BEGIN
|
||||
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 # Rotate # # master-bin.000002;pos=4
|
||||
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 # BEGIN
|
||||
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 # use `test`; create table t3 (a int)ENGINE=MyISAM
|
||||
slave-bin.000001 # Rotate 2 # slave-bin.000002;pos=4
|
||||
|
@ -34,4 +34,36 @@ connection master;
|
||||
drop database mysqltest;
|
||||
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
|
||||
|
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;
|
||||
|
||||
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));
|
||||
insert into t1 values(1, connection_id(), 0, 0, "");
|
||||
# don't put rand and password in the same query, to see if they replicate
|
||||
# independently
|
||||
# Pure rand test
|
||||
--disable_warnings
|
||||
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()
|
||||
# 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.
|
||||
@ -19,7 +23,9 @@ set sql_log_bin=1;
|
||||
# Pure password test
|
||||
insert into t1 values(3, 0, 0, 0, password('does_this_work?'));
|
||||
# "altogether now"
|
||||
--disable_warnings
|
||||
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;
|
||||
let $MYSQLD_DATADIR= `select @@datadir`;
|
||||
sync_slave_with_master;
|
||||
@ -73,11 +79,13 @@ DELIMITER ;|
|
||||
|
||||
# Exercise the functions and procedures then compare the results on
|
||||
# the master to those on the slave.
|
||||
--disable_warnings
|
||||
CALL test_replication_sp1();
|
||||
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());
|
||||
--enable_warnings
|
||||
|
||||
--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
|
||||
|
||||
CALL mtr.add_suppression('Statement may not be safe to log in statement format.');
|
||||
|
||||
CREATE TABLE t1 (a VARCHAR(1000));
|
||||
|
||||
# We replicate the connection_id in the query_log_event
|
||||
@ -41,7 +43,9 @@ INSERT INTO t1 VALUES
|
||||
(UTC_TIMESTAMP());
|
||||
|
||||
# We replicate the random seed in a rand_log_event
|
||||
--disable_warnings
|
||||
INSERT INTO t1 VALUES (RAND());
|
||||
--enable_warnings
|
||||
# We replicate the last_insert_id in an intvar_log_event
|
||||
INSERT INTO t1 VALUES (LAST_INSERT_ID());
|
||||
|
||||
|
@ -15,6 +15,7 @@
|
||||
|
||||
disable_query_log;
|
||||
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;
|
||||
|
||||
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;
|
||||
save_master_pos;
|
||||
# a few updates to force OPTIMIZE to do something
|
||||
update t1 set b=(a/2*rand());
|
||||
--disable_warnings
|
||||
update t1 set b=(a/2*rand());
|
||||
delete from t1 order by b limit 10000;
|
||||
--enable_warnings
|
||||
|
||||
|
@ -2,38 +2,39 @@
|
||||
# BUG#42749: infinite loop writing to row based binlog - processlist shows
|
||||
# "freeing items"
|
||||
#
|
||||
#
|
||||
# WHY
|
||||
# ===
|
||||
#
|
||||
# This bug would make table map event to report data_written one byte less
|
||||
# than what would actually be written in its body. This would cause one byte shorter
|
||||
# event end_log_pos. The ultimate impact was that it would make fixing the
|
||||
# position in MYSQL_BIN_LOG::write_cache bogus or end up in an infinite loop.
|
||||
#
|
||||
# This bug would make table map event to report data_written one
|
||||
# byte less than what would actually be written in its body. This
|
||||
# would cause one byte shorter event end_log_pos. The ultimate
|
||||
# impact was that it would make fixing the position in
|
||||
# MYSQL_BIN_LOG::write_cache bogus or end up in an infinite loop.
|
||||
#
|
||||
# HOW
|
||||
# ===
|
||||
#
|
||||
# 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;
|
||||
# iii) the logs are flushed;
|
||||
# iv) mysqlbinlog is used to check if it succeeds.
|
||||
#
|
||||
# In step iv), before the bug was fixed, the test case would fail with
|
||||
# mysqlbinlog reporting that it was unable to succeed in reading the event.
|
||||
#
|
||||
# In step iv), before the bug was fixed, the test case would fail
|
||||
# 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_binlog_format_row.inc
|
||||
-- connection default
|
||||
|
||||
RESET MASTER;
|
||||
|
||||
-- disable_warnings
|
||||
DROP TABLE IF EXISTS `t1`;
|
||||
-- enable_warnings
|
||||
|
||||
-- echo ### TABLE with field_metadata_size == 290
|
||||
CREATE TABLE `t1` (
|
||||
`c1` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`c2` varchar(30) NOT NULL,
|
||||
@ -185,15 +186,155 @@ CREATE TABLE `t1` (
|
||||
) ENGINE=InnoDB;
|
||||
|
||||
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`;
|
||||
|
||||
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.
|
||||
|
||||
-- let $MYSQLD_DATADIR= `SELECT @@datadir`;
|
||||
-- exec $MYSQL_BINLOG $MYSQLD_DATADIR/master-bin.000001 > $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 ---
|
||||
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
|
||||
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 ---
|
||||
DELETE FROM t1 WHERE id = 42;
|
||||
--- Show current count on master for t1 ---
|
||||
|
@ -4,6 +4,7 @@ reset master;
|
||||
reset slave;
|
||||
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
|
||||
start slave;
|
||||
CALL mtr.add_suppression('Statement may not be safe to log in statement format.');
|
||||
DROP FUNCTION IF EXISTS test.f1;
|
||||
DROP TABLE IF EXISTS test.t1;
|
||||
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
|
||||
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
|
||||
|
||||
#
|
||||
|
@ -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(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,@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;
|
||||
|
||||
#
|
||||
|
@ -80,7 +80,7 @@ CREATE TABLE t3 (
|
||||
FULLTEXT KEY betreff (betreff)
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=996 ;
|
||||
|
||||
--error 1054
|
||||
--error ER_CANT_USE_OPTION_HERE
|
||||
select a.text, b.id, b.betreff
|
||||
from
|
||||
t2 a inner join t3 b on a.id = b.forum inner join
|
||||
@ -100,7 +100,7 @@ group by
|
||||
order by
|
||||
match(b.betreff) against ('+abc' in boolean mode) desc;
|
||||
|
||||
--error 1054
|
||||
--error ER_CANT_USE_OPTION_HERE
|
||||
select a.text, b.id, b.betreff
|
||||
from
|
||||
t2 a inner join t3 b on a.id = b.forum inner join
|
||||
@ -117,6 +117,7 @@ where
|
||||
order by
|
||||
match(b.betreff) against ('+abc' in boolean mode) desc;
|
||||
|
||||
--error ER_CANT_USE_OPTION_HERE
|
||||
select a.text, b.id, b.betreff
|
||||
from
|
||||
t2 a inner join t3 b on a.id = b.forum inner join
|
||||
|
@ -4,6 +4,7 @@
|
||||
|
||||
--disable_warnings
|
||||
DROP TABLE IF EXISTS t1;
|
||||
DROP PROCEDURE IF EXISTS p1;
|
||||
--enable_warnings
|
||||
|
||||
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;
|
||||
|
||||
|
||||
--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
|
||||
|
@ -2014,6 +2014,22 @@ deallocate prepare stmt;
|
||||
drop table t1,t2;
|
||||
--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.
|
||||
|
||||
#
|
||||
|
@ -8242,6 +8242,25 @@ while ($tab_count)
|
||||
DROP PROCEDURE p1;
|
||||
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 # 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;
|
||||
|
||||
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;
|
||||
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
|
||||
|
||||
#
|
||||
|
@ -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()))
|
||||
&& new_field->charset == field_charset &&
|
||||
((Field_blob *)new_field->field)->max_data_length() ==
|
||||
max_data_length());
|
||||
new_field->pack_length == pack_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());
|
||||
}
|
||||
|
||||
#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
|
||||
@ -5911,43 +5928,67 @@ const key_map *ha_partition::keys_to_use_for_scanning()
|
||||
|
||||
double ha_partition::scan_time()
|
||||
{
|
||||
double scan_time= 0;
|
||||
handler **file;
|
||||
double scan_time= 0.0;
|
||||
uint first, part_id, num_used_parts, check_min_num, partitions_called= 0;
|
||||
DBUG_ENTER("ha_partition::scan_time");
|
||||
|
||||
for (file= m_file; *file; file++)
|
||||
if (bitmap_is_set(&(m_part_info->used_partitions), (file - m_file)))
|
||||
scan_time+= (*file)->scan_time();
|
||||
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;
|
||||
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);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
Get time to read
|
||||
Estimate rows for records_in_range or estimate_rows_upper_bound.
|
||||
|
||||
SYNOPSIS
|
||||
read_time()
|
||||
index Index number used
|
||||
ranges Number of ranges
|
||||
rows Number of rows
|
||||
@param is_records_in_range call records_in_range instead of
|
||||
estimate_rows_upper_bound.
|
||||
@param inx (only for records_in_range) index to use.
|
||||
@param min_key (only for records_in_range) start of range.
|
||||
@param max_key (only for records_in_range) end of range.
|
||||
|
||||
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.
|
||||
@return Number of rows or HA_POS_ERROR.
|
||||
*/
|
||||
|
||||
double ha_partition::read_time(uint index, uint ranges, ha_rows rows)
|
||||
ha_rows ha_partition::estimate_rows(bool is_records_in_range, uint inx,
|
||||
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
|
||||
|
||||
@ -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,
|
||||
key_range *max_key)
|
||||
{
|
||||
handler **file;
|
||||
ha_rows in_range= 0;
|
||||
DBUG_ENTER("ha_partition::records_in_range");
|
||||
|
||||
file= m_file;
|
||||
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);
|
||||
DBUG_RETURN(estimate_rows(TRUE, inx, min_key, max_key));
|
||||
}
|
||||
|
||||
|
||||
@ -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 rows, tot_rows= 0;
|
||||
handler **file;
|
||||
DBUG_ENTER("ha_partition::estimate_rows_upper_bound");
|
||||
|
||||
file= m_file;
|
||||
do
|
||||
{
|
||||
if (bitmap_is_set(&(m_part_info->used_partitions), (file - m_file)))
|
||||
{
|
||||
rows= (*file)->estimate_rows_upper_bound();
|
||||
if (rows == HA_POS_ERROR)
|
||||
DBUG_RETURN(HA_POS_ERROR);
|
||||
tot_rows+= rows;
|
||||
}
|
||||
} while (*(++file));
|
||||
DBUG_RETURN(tot_rows);
|
||||
DBUG_RETURN(estimate_rows(FALSE, 0, NULL, NULL));
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
Get time to read
|
||||
|
||||
SYNOPSIS
|
||||
read_time()
|
||||
index Index number used
|
||||
ranges Number of ranges
|
||||
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
|
||||
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 */
|
||||
/* Original item name (if it was renamed)*/
|
||||
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;
|
||||
uint32 max_length;
|
||||
uint name_length; /* Length of name */
|
||||
@ -987,6 +994,23 @@ public:
|
||||
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
|
||||
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)
|
||||
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) {
|
||||
case 0:
|
||||
{
|
||||
|
@ -607,7 +607,7 @@ void Item_func::signal_divide_by_null()
|
||||
|
||||
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 copy_or_same(thd);
|
||||
}
|
||||
|
@ -215,6 +215,11 @@ public:
|
||||
{
|
||||
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())
|
||||
{
|
||||
/* We have room in str; We can't get any errors here */
|
||||
if (str == res2)
|
||||
{ // This is quote uncommon!
|
||||
if (str->ptr() == res2->ptr())
|
||||
{ // This is quite uncommon!
|
||||
str->replace(0,0,*sep_str);
|
||||
str->replace(0,0,*res);
|
||||
}
|
||||
|
@ -3275,7 +3275,18 @@ START SLAVE; . Query: '%s'", expected_error, thd->query());
|
||||
|
||||
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
|
||||
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
|
||||
elements in the field metadata array.
|
||||
*/
|
||||
if (m_field_metadata_size > 255)
|
||||
m_data_size+= m_field_metadata_size + 3;
|
||||
else
|
||||
if (m_field_metadata_size < 251)
|
||||
m_data_size+= m_field_metadata_size + 1;
|
||||
else
|
||||
m_data_size+= m_field_metadata_size + 3;
|
||||
|
||||
bzero(m_null_bits, num_null_bytes);
|
||||
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)
|
||||
{
|
||||
result= cmp_record(table,record[1]);
|
||||
@ -8858,14 +8887,33 @@ static bool record_compare(TABLE *table)
|
||||
goto record_compare_exit;
|
||||
}
|
||||
|
||||
record_compare_field_by_field:
|
||||
|
||||
/* Compare updated fields */
|
||||
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;
|
||||
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:
|
||||
|
@ -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)
|
||||
{
|
||||
result= cmp_record(table,record[1]);
|
||||
@ -345,14 +363,33 @@ static bool record_compare(TABLE *table)
|
||||
goto record_compare_exit;
|
||||
}
|
||||
|
||||
record_compare_field_by_field:
|
||||
|
||||
/* Compare updated fields */
|
||||
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;
|
||||
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:
|
||||
|
@ -2799,8 +2799,15 @@ sp_lex_keeper::reset_lex_and_exec_core(THD *thd, uint *nextp,
|
||||
m_lex->mark_as_requiring_prelocking(NULL);
|
||||
}
|
||||
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
|
||||
|
@ -292,7 +292,7 @@ static my_bool acl_load(THD *thd, TABLE_LIST *tables)
|
||||
{
|
||||
TABLE *table;
|
||||
READ_RECORD read_record_info;
|
||||
my_bool return_val= 1;
|
||||
my_bool return_val= TRUE;
|
||||
bool check_no_resolve= specialflag & SPECIAL_NO_RESOLVE;
|
||||
char tmp_name[NAME_LEN+1];
|
||||
int password_length;
|
||||
@ -605,7 +605,7 @@ static my_bool acl_load(THD *thd, TABLE_LIST *tables)
|
||||
init_check_host();
|
||||
|
||||
initialized=1;
|
||||
return_val=0;
|
||||
return_val= FALSE;
|
||||
|
||||
end:
|
||||
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;
|
||||
MEM_ROOT old_mem;
|
||||
bool old_initialized;
|
||||
my_bool return_val= 1;
|
||||
my_bool return_val= TRUE;
|
||||
DBUG_ENTER("acl_reload");
|
||||
|
||||
if (thd->locked_tables)
|
||||
@ -683,8 +683,13 @@ my_bool acl_reload(THD *thd)
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
|
@ -683,7 +683,11 @@ static bool write_execute_load_query_log_event(THD *thd, sql_exchange* ex,
|
||||
if (n++)
|
||||
pfields.append(", ");
|
||||
if (item->name)
|
||||
{
|
||||
pfields.append("`");
|
||||
pfields.append(item->name);
|
||||
pfields.append("`");
|
||||
}
|
||||
else
|
||||
item->print(&pfields, QT_ORDINARY);
|
||||
}
|
||||
@ -703,7 +707,9 @@ static bool write_execute_load_query_log_event(THD *thd, sql_exchange* ex,
|
||||
val= lv++;
|
||||
if (n++)
|
||||
pfields.append(", ");
|
||||
pfields.append("`");
|
||||
pfields.append(item->name);
|
||||
pfields.append("`");
|
||||
pfields.append("=");
|
||||
val->print(&pfields, QT_ORDINARY);
|
||||
}
|
||||
|
@ -623,8 +623,10 @@ void free_items(Item *item)
|
||||
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)
|
||||
{
|
||||
DBUG_ENTER("cleanup_items");
|
||||
@ -3282,17 +3284,6 @@ end_with_restore_list:
|
||||
}
|
||||
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 */
|
||||
thd->variables.option_bits|= OPTION_KEEP_LOG;
|
||||
}
|
||||
@ -6822,13 +6813,13 @@ bool reload_acl_and_cache(THD *thd, ulong options, TABLE_LIST *tables,
|
||||
thd->thread_stack= (char*) &tmp_thd;
|
||||
thd->store_globals();
|
||||
}
|
||||
|
||||
|
||||
if (thd)
|
||||
{
|
||||
bool reload_acl_failed= acl_reload(thd);
|
||||
bool reload_grants_failed= grant_reload(thd);
|
||||
bool reload_servers_failed= servers_reload(thd);
|
||||
|
||||
|
||||
if (reload_acl_failed || reload_grants_failed || reload_servers_failed)
|
||||
{
|
||||
result= 1;
|
||||
@ -7001,7 +6992,10 @@ bool reload_acl_and_cache(THD *thd, ulong options, TABLE_LIST *tables,
|
||||
if (options & REFRESH_USER_RESOURCES)
|
||||
reset_mqh((LEX_USER *) NULL, 0); /* purecov: inspected */
|
||||
*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");
|
||||
switch (mysql_bin_log.find_next_log(&linfo, 1)) {
|
||||
case LOG_INFO_EOF:
|
||||
loop_breaker = (flags & BINLOG_DUMP_NON_BLOCK);
|
||||
break;
|
||||
case 0:
|
||||
break;
|
||||
case LOG_INFO_EOF:
|
||||
if (mysql_bin_log.is_active(log_file_name))
|
||||
{
|
||||
loop_breaker = (flags & BINLOG_DUMP_NON_BLOCK);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
errmsg = "could not find next log";
|
||||
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;
|
||||
}
|
||||
|
||||
if (!thd->lex->view_prepare_mode)
|
||||
if (!thd->lex->view_prepare_mode && !(select_options & SELECT_DESCRIBE))
|
||||
{
|
||||
Item_subselect *subselect;
|
||||
/* Is it subselect? */
|
||||
@ -7170,6 +7170,7 @@ static void update_depend_map(JOIN *join, ORDER *order)
|
||||
table_map depend_map;
|
||||
order->item[0]->update_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
|
||||
if (!(order->depend_map & (OUTER_REF_TABLE_BIT | RAND_TABLE_BIT))
|
||||
&& !order->item[0]->with_sum_func)
|
||||
|
@ -264,8 +264,14 @@ bool servers_reload(THD *thd)
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
|
@ -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 |
|
||||
TMP_TABLE_ALL_COLUMNS);
|
||||
/*
|
||||
@ -669,7 +698,7 @@ bool st_select_lex_unit::cleanup()
|
||||
{
|
||||
ORDER *ord;
|
||||
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 "sql_trigger.h"
|
||||
#include "probes_mysql.h"
|
||||
#include "debug_sync.h"
|
||||
|
||||
/* Return 0 if row hasn't changed */
|
||||
|
||||
@ -1137,8 +1138,11 @@ reopen_tables:
|
||||
items from 'fields' list, so the cleanup above is necessary to.
|
||||
*/
|
||||
cleanup_items(thd->free_list);
|
||||
|
||||
cleanup_items(thd->stmt_arena->free_list);
|
||||
close_tables_for_reopen(thd, &table_list);
|
||||
|
||||
DEBUG_SYNC(thd, "multi_update_reopen_tables");
|
||||
|
||||
goto reopen_tables;
|
||||
}
|
||||
|
||||
|
@ -30,13 +30,13 @@ pkglib_LIBRARIES = libmystrings.a
|
||||
# Exact one of ASSEMBLER_X
|
||||
if ASSEMBLER_x86
|
||||
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
|
||||
if ASSEMBLER_sparc32
|
||||
# These file MUST all be on the same line!! Otherwise automake
|
||||
# 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
|
||||
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
|
||||
#no assembler
|
||||
ASRCS =
|
||||
|
@ -24,13 +24,11 @@
|
||||
#include <my_global.h>
|
||||
#include "m_string.h"
|
||||
|
||||
#ifdef BAD_STRING_COMPILER
|
||||
#ifdef strmov
|
||||
#undef strmov
|
||||
#define strmov strmov_overlapp
|
||||
#endif
|
||||
|
||||
#ifndef strmov
|
||||
|
||||
#if !defined(MC68000) && !defined(DS90)
|
||||
|
||||
char *strmov(register char *dst, register const char *src)
|
||||
@ -53,5 +51,3 @@ char *strmov(dst, src)
|
||||
}
|
||||
|
||||
#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
|
||||
# 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!@''MYSQL_BASE_VERSION''@!@MYSQL_BASE_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_TCP_PORT''@!@MYSQL_TCP_PORT@!' \
|
||||
-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
|
||||
#
|
||||
@ -7,8 +8,6 @@
|
||||
# separate "MySQL-shared" package. This spec file simply repackages two
|
||||
# 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
|
||||
# under the terms of the GNU General Public License as published by the Free
|
||||
# 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
|
||||
#
|
||||
%define version50 @MYSQL_NO_DASH_VERSION@
|
||||
%define version_cur @MYSQL_U_SCORE_VERSION@
|
||||
%define version41 4.1.17
|
||||
%define version40 4.0.26
|
||||
%define version3 3.23.58
|
||||
|
||||
Name: MySQL-shared-compat
|
||||
Packager: MySQL Product Engineering team <build@mysql.com>
|
||||
Vendor: MySQL AB
|
||||
Packager: Sun Microsystems, Inc. Product Engineering Team <build@mysql.com>
|
||||
Vendor: Sun Microsystems, Inc.
|
||||
License: GPL
|
||||
Group: Applications/Databases
|
||||
URL: http://www.mysql.com/
|
||||
Autoreqprov: on
|
||||
Version: %{version50}
|
||||
Release: 0
|
||||
Version: %{version_cur}
|
||||
Release: 1
|
||||
BuildRoot: %{_tmppath}/%{name}-%{version}-build
|
||||
Obsoletes: MySQL-shared, mysql-shared
|
||||
Provides: MySQL-shared
|
||||
Summary: MySQL shared client libraries for MySQL %{version}, %{version41}, %{version40} and %{version3}
|
||||
# We simply use the "MySQL-shared" subpackages as input sources instead of
|
||||
# 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
|
||||
Source2: MySQL-shared-%{version40}-0.%{_arch}.rpm
|
||||
Source3: MySQL-shared-%{version3}-1.%{_arch}.rpm
|
||||
@ -62,7 +61,7 @@ BuildRoot: %{_tmppath}/%{name}-%{version}-build
|
||||
|
||||
%description
|
||||
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
|
||||
installed that are dynamically linked against older versions of the MySQL
|
||||
client library but you want to upgrade to MySQL %{version} without breaking the
|
||||
@ -84,3 +83,14 @@ rpm2cpio %{SOURCE3} | cpio -iv --make-directories
|
||||
%files
|
||||
%defattr(-, root, root)
|
||||
%{_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
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
@ -50,9 +50,9 @@
|
||||
%{!?malloc_lib_target:%define WITH_TCMALLOC 0}
|
||||
|
||||
%if %{STATIC_BUILD}
|
||||
%define release 0
|
||||
%define release 1
|
||||
%else
|
||||
%define release 0.glibc23
|
||||
%define release 1.glibc23
|
||||
%endif
|
||||
%define mysql_license GPL
|
||||
%define mysqld_user mysql
|
||||
@ -64,6 +64,19 @@
|
||||
# See BUG#998 for details.
|
||||
%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
|
||||
|
||||
# On SuSE 9 no separate "debuginfo" package is built. To enable basic
|
||||
@ -86,7 +99,7 @@
|
||||
Name: MySQL
|
||||
Summary: MySQL: a very fast and reliable SQL database server
|
||||
Group: Applications/Databases
|
||||
Version: @MYSQL_NO_DASH_VERSION@
|
||||
Version: @MYSQL_U_SCORE_VERSION@
|
||||
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.
|
||||
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
|
||||
|
||||
%package test
|
||||
Requires: %{name}-client perl-DBI perl
|
||||
Requires: %{name}-client perl
|
||||
Summary: MySQL - Test suite
|
||||
Group: Applications/Databases
|
||||
Provides: mysql-test
|
||||
@ -673,7 +686,7 @@ fi
|
||||
%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_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_upgrade.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) %{_libdir}/mysql/plugin/ha_example.so*
|
||||
%attr(755, root, root) %{_libdir}/mysql/plugin/libsemisync_master.so*
|
||||
%attr(755, root, root) %{_libdir}/mysql/plugin/libsemisync_slave.so*
|
||||
%attr(755, root, root) %{_libdir}/mysql/plugin/semisync_master.so*
|
||||
%attr(755, root, root) %{_libdir}/mysql/plugin/semisync_slave.so*
|
||||
|
||||
%if %{WITH_TCMALLOC}
|
||||
%attr(755, root, root) %{_libdir}/mysql/%{malloc_lib_target}
|
||||
@ -849,10 +862,10 @@ fi
|
||||
%{_libdir}/mysql/libz.la
|
||||
%{_libdir}/mysql/plugin/ha_example.a
|
||||
%{_libdir}/mysql/plugin/ha_example.la
|
||||
%{_libdir}/mysql/plugin/libsemisync_master.a
|
||||
%{_libdir}/mysql/plugin/libsemisync_master.la
|
||||
%{_libdir}/mysql/plugin/libsemisync_slave.a
|
||||
%{_libdir}/mysql/plugin/libsemisync_slave.la
|
||||
%{_libdir}/mysql/plugin/semisync_master.a
|
||||
%{_libdir}/mysql/plugin/semisync_master.la
|
||||
%{_libdir}/mysql/plugin/semisync_slave.a
|
||||
%{_libdir}/mysql/plugin/semisync_slave.la
|
||||
|
||||
%files shared
|
||||
%defattr(-, root, root, 0755)
|
||||
@ -882,6 +895,20 @@ fi
|
||||
# itself - note that they must be ordered by date (important when
|
||||
# merging BK trees)
|
||||
%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>
|
||||
|
||||
- Fix some problems with the directives around "tcmalloc" (experimental),
|
||||
|
Loading…
x
Reference in New Issue
Block a user