Merge branch '5.5' into 10.0
This commit is contained in:
commit
271fed4106
3
.gitignore
vendored
3
.gitignore
vendored
@ -59,6 +59,9 @@ include/mysql_version.h
|
||||
include/mysqld_ername.h
|
||||
include/mysqld_error.h
|
||||
include/sql_state.h
|
||||
include/probes_mysql.d
|
||||
include/probes_mysql_dtrace.h
|
||||
include/probes_mysql_nodtrace.h
|
||||
info_macros.cmake
|
||||
libmysql*/libmysql*_exports_file.cc
|
||||
libmysql*/merge_archives_mysql*.cmake
|
||||
|
@ -184,7 +184,8 @@ static const char *load_default_groups[]=
|
||||
static void free_used_memory(void)
|
||||
{
|
||||
/* Free memory allocated by 'load_defaults' */
|
||||
free_defaults(defaults_argv);
|
||||
if (defaults_argv)
|
||||
free_defaults(defaults_argv);
|
||||
|
||||
dynstr_free(&ds_args);
|
||||
dynstr_free(&conn_args);
|
||||
@ -1096,7 +1097,6 @@ int main(int argc, char **argv)
|
||||
if (opt_systables_only && !opt_silent)
|
||||
printf("The --upgrade-system-tables option was used, user tables won't be touched.\n");
|
||||
|
||||
|
||||
/*
|
||||
Read the mysql_upgrade_info file to check if mysql_upgrade
|
||||
already has been run for this installation of MySQL
|
||||
|
@ -86,6 +86,9 @@ IF(ENABLE_DTRACE)
|
||||
${CMAKE_BINARY_DIR}/include/probes_mysql_dtrace.h
|
||||
${CMAKE_BINARY_DIR}/include/probes_mysql_nodtrace.h
|
||||
)
|
||||
ELSE()
|
||||
CONFIGURE_FILE(${CMAKE_SOURCE_DIR}/include/probes_mysql_nodtrace.h.in
|
||||
${CMAKE_BINARY_DIR}/include/probes_mysql_nodtrace.h COPYONLY)
|
||||
ENDIF()
|
||||
|
||||
FUNCTION(DTRACE_INSTRUMENT target)
|
||||
|
@ -790,16 +790,36 @@ ENDIF()
|
||||
#
|
||||
# Test for how the C compiler does inline, if at all
|
||||
#
|
||||
# SunPro is weird, apparently it only supports inline at -xO3 or -xO4.
|
||||
# And if CMAKE_C_FLAGS has -xO4 but CMAKE_C_FLAGS_${CMAKE_BUILD_TYPE} has -xO2
|
||||
# then CHECK_C_SOURCE_COMPILES will succeed but the built will fail.
|
||||
# We must test all flags here.
|
||||
# XXX actually, we can do this for all compilers, not only SunPro
|
||||
IF (CMAKE_CXX_COMPILER_ID MATCHES "SunPro" AND
|
||||
CMAKE_GENERATOR MATCHES "Makefiles")
|
||||
STRING(TOUPPER "CMAKE_C_FLAGS_${CMAKE_BUILD_TYPE}" flags)
|
||||
SET(CMAKE_REQUIRED_FLAGS "${${flags}}")
|
||||
ENDIF()
|
||||
CHECK_C_SOURCE_COMPILES("
|
||||
static inline int foo(){return 0;}
|
||||
extern int bar(int x);
|
||||
static inline int foo(){return bar(1);}
|
||||
int main(int argc, char *argv[]){return 0;}"
|
||||
C_HAS_inline)
|
||||
IF(NOT C_HAS_inline)
|
||||
CHECK_C_SOURCE_COMPILES("
|
||||
static __inline int foo(){return 0;}
|
||||
extern int bar(int x);
|
||||
static __inline int foo(){return bar(1);}
|
||||
int main(int argc, char *argv[]){return 0;}"
|
||||
C_HAS___inline)
|
||||
SET(C_INLINE __inline)
|
||||
IF(C_HAS___inline)
|
||||
SET(C_INLINE __inline)
|
||||
ElSE()
|
||||
SET(C_INLINE)
|
||||
MESSAGE(WARNING "C compiler does not support funcion inlining")
|
||||
IF(NOT NOINLINE)
|
||||
MESSAGE(FATAL_ERROR "Use -DNOINLINE=TRUE to allow compilation without inlining")
|
||||
ENDIF()
|
||||
ENDIF()
|
||||
ENDIF()
|
||||
|
||||
IF(NOT CMAKE_CROSSCOMPILING AND NOT MSVC)
|
||||
|
@ -12,6 +12,17 @@ before calling SSL_new();
|
||||
|
||||
*** end Note ***
|
||||
|
||||
yaSSL Release notes, version 2.3.9 (12/01/2015)
|
||||
This release of yaSSL fixes two client side Diffie-Hellman problems.
|
||||
yaSSL was only handling the cases of zero or one leading zeros for the key
|
||||
agreement instead of potentially any number. This caused about 1 in 50,000
|
||||
connections to fail when using DHE cipher suites. The second problem was
|
||||
the case where a server would send a public value shorter than the prime
|
||||
value, causing about 1 in 128 client connections to fail, and also
|
||||
caused the yaSSL client to read off the end of memory. All client side
|
||||
DHE cipher suite users should update.
|
||||
Thanks to Adam Langely (agl@imperialviolet.org) for the detailed report!
|
||||
|
||||
yaSSL Release notes, version 2.3.8 (9/17/2015)
|
||||
This release of yaSSL fixes a high security vulnerability. All users
|
||||
SHOULD update. If using yaSSL for TLS on the server side with private
|
||||
|
@ -378,6 +378,7 @@ public:
|
||||
|
||||
uint get_agreedKeyLength() const;
|
||||
const byte* get_agreedKey() const;
|
||||
uint get_publicKeyLength() const;
|
||||
const byte* get_publicKey() const;
|
||||
void makeAgreement(const byte*, unsigned int);
|
||||
|
||||
|
@ -34,7 +34,7 @@
|
||||
#include "rsa.h"
|
||||
|
||||
|
||||
#define YASSL_VERSION "2.3.8"
|
||||
#define YASSL_VERSION "2.3.9"
|
||||
|
||||
|
||||
#if defined(__cplusplus)
|
||||
|
@ -751,9 +751,10 @@ struct DiffieHellman::DHImpl {
|
||||
byte* publicKey_;
|
||||
byte* privateKey_;
|
||||
byte* agreedKey_;
|
||||
uint pubKeyLength_;
|
||||
|
||||
DHImpl(TaoCrypt::RandomNumberGenerator& r) : ranPool_(r), publicKey_(0),
|
||||
privateKey_(0), agreedKey_(0) {}
|
||||
privateKey_(0), agreedKey_(0), pubKeyLength_(0) {}
|
||||
~DHImpl()
|
||||
{
|
||||
ysArrayDelete(agreedKey_);
|
||||
@ -762,7 +763,7 @@ struct DiffieHellman::DHImpl {
|
||||
}
|
||||
|
||||
DHImpl(const DHImpl& that) : dh_(that.dh_), ranPool_(that.ranPool_),
|
||||
publicKey_(0), privateKey_(0), agreedKey_(0)
|
||||
publicKey_(0), privateKey_(0), agreedKey_(0), pubKeyLength_(0)
|
||||
{
|
||||
uint length = dh_.GetByteLength();
|
||||
AllocKeys(length, length, length);
|
||||
@ -810,7 +811,7 @@ DiffieHellman::DiffieHellman(const byte* p, unsigned int pSz, const byte* g,
|
||||
using TaoCrypt::Integer;
|
||||
|
||||
pimpl_->dh_.Initialize(Integer(p, pSz).Ref(), Integer(g, gSz).Ref());
|
||||
pimpl_->publicKey_ = NEW_YS opaque[pubSz];
|
||||
pimpl_->publicKey_ = NEW_YS opaque[pimpl_->pubKeyLength_ = pubSz];
|
||||
memcpy(pimpl_->publicKey_, pub, pubSz);
|
||||
}
|
||||
|
||||
@ -869,6 +870,10 @@ const byte* DiffieHellman::get_agreedKey() const
|
||||
return pimpl_->agreedKey_;
|
||||
}
|
||||
|
||||
uint DiffieHellman::get_publicKeyLength() const
|
||||
{
|
||||
return pimpl_->pubKeyLength_;
|
||||
}
|
||||
|
||||
const byte* DiffieHellman::get_publicKey() const
|
||||
{
|
||||
|
@ -109,15 +109,12 @@ void ClientDiffieHellmanPublic::build(SSL& ssl)
|
||||
uint keyLength = dhClient.get_agreedKeyLength(); // pub and agree same
|
||||
|
||||
alloc(keyLength, true);
|
||||
dhClient.makeAgreement(dhServer.get_publicKey(), keyLength);
|
||||
dhClient.makeAgreement(dhServer.get_publicKey(),
|
||||
dhServer.get_publicKeyLength());
|
||||
c16toa(keyLength, Yc_);
|
||||
memcpy(Yc_ + KEY_OFFSET, dhClient.get_publicKey(), keyLength);
|
||||
|
||||
// because of encoding first byte might be zero, don't use it for preMaster
|
||||
if (*dhClient.get_agreedKey() == 0)
|
||||
ssl.set_preMaster(dhClient.get_agreedKey() + 1, keyLength - 1);
|
||||
else
|
||||
ssl.set_preMaster(dhClient.get_agreedKey(), keyLength);
|
||||
ssl.set_preMaster(dhClient.get_agreedKey(), keyLength);
|
||||
}
|
||||
|
||||
|
||||
@ -321,11 +318,7 @@ void ClientDiffieHellmanPublic::read(SSL& ssl, input_buffer& input)
|
||||
}
|
||||
dh.makeAgreement(Yc_, keyLength);
|
||||
|
||||
// because of encoding, first byte might be 0, don't use for preMaster
|
||||
if (*dh.get_agreedKey() == 0)
|
||||
ssl.set_preMaster(dh.get_agreedKey() + 1, dh.get_agreedKeyLength() - 1);
|
||||
else
|
||||
ssl.set_preMaster(dh.get_agreedKey(), dh.get_agreedKeyLength());
|
||||
ssl.set_preMaster(dh.get_agreedKey(), dh.get_agreedKeyLength());
|
||||
ssl.makeMasterSecret();
|
||||
}
|
||||
|
||||
|
@ -807,6 +807,19 @@ void SSL::set_random(const opaque* random, ConnectionEnd sender)
|
||||
// store client pre master secret
|
||||
void SSL::set_preMaster(const opaque* pre, uint sz)
|
||||
{
|
||||
uint i(0); // trim leading zeros
|
||||
uint fullSz(sz);
|
||||
|
||||
while (i++ < fullSz && *pre == 0) {
|
||||
sz--;
|
||||
pre++;
|
||||
}
|
||||
|
||||
if (sz == 0) {
|
||||
SetError(bad_input);
|
||||
return;
|
||||
}
|
||||
|
||||
secure_.use_connection().AllocPreSecret(sz);
|
||||
memcpy(secure_.use_connection().pre_master_secret_, pre, sz);
|
||||
}
|
||||
@ -924,6 +937,8 @@ void SSL::order_error()
|
||||
// Create and store the master secret see page 32, 6.1
|
||||
void SSL::makeMasterSecret()
|
||||
{
|
||||
if (GetError()) return;
|
||||
|
||||
if (isTLS())
|
||||
makeTLSMasterSecret();
|
||||
else {
|
||||
|
@ -200,20 +200,6 @@
|
||||
#define likely(x) __builtin_expect(((x) != 0),1)
|
||||
#define unlikely(x) __builtin_expect(((x) != 0),0)
|
||||
|
||||
/*
|
||||
now let's figure out if inline functions are supported
|
||||
autoconf defines 'inline' to be empty, if not
|
||||
*/
|
||||
#define inline_test_1(X) X ## 1
|
||||
#define inline_test_2(X) inline_test_1(X)
|
||||
#if inline_test_2(inline) != 1
|
||||
#define HAVE_INLINE
|
||||
#else
|
||||
#error Compiler does not support inline!
|
||||
#endif
|
||||
#undef inline_test_2
|
||||
#undef inline_test_1
|
||||
|
||||
/* Fix problem with S_ISLNK() on Linux */
|
||||
#if defined(TARGET_OS_LINUX) || defined(__GLIBC__)
|
||||
#undef _GNU_SOURCE
|
||||
@ -454,7 +440,7 @@ extern "C" int madvise(void *addr, size_t len, int behav);
|
||||
#endif
|
||||
|
||||
#ifndef STDERR_FILENO
|
||||
#define STDERR_FILENO 2
|
||||
#define STDERR_FILENO fileno(stderr)
|
||||
#endif
|
||||
|
||||
/*
|
||||
|
@ -1,5 +1,5 @@
|
||||
/* Copyright (c) 2011, 2015, Oracle and/or its affiliates.
|
||||
Copyright (c) 2011, 2015, MariaDB
|
||||
/* Copyright (c) 2011, 2016, Oracle and/or its affiliates.
|
||||
Copyright (c) 2011, 2016, MariaDB
|
||||
|
||||
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
|
||||
@ -17,7 +17,7 @@
|
||||
#ifndef _welcome_copyright_notice_h_
|
||||
#define _welcome_copyright_notice_h_
|
||||
|
||||
#define COPYRIGHT_NOTICE_CURRENT_YEAR "2015"
|
||||
#define COPYRIGHT_NOTICE_CURRENT_YEAR "2016"
|
||||
|
||||
/*
|
||||
This define specifies copyright notice which is displayed by every MySQL
|
||||
|
@ -2662,5 +2662,21 @@ Warnings:
|
||||
Note 1291 Column 'a' has duplicated value '' in ENUM
|
||||
drop table t1;
|
||||
set @@session.collation_server=default;
|
||||
#
|
||||
# MDEV-7765: Crash (Assertion `!table || (!table->write_set ||
|
||||
# bitmap_is_set(table->write_set, field_index) ||
|
||||
# bitmap_is_set(table->vcol_set, field_index))' fails)
|
||||
# on using function over not created table
|
||||
#
|
||||
CREATE function f1() returns int
|
||||
BEGIN
|
||||
declare n int;
|
||||
set n:= (select count(*) from t1);
|
||||
return n;
|
||||
end|
|
||||
create table t1 as select f1();
|
||||
ERROR 42S02: Table 'test.t1' doesn't exist
|
||||
drop function f1;
|
||||
End of 5.5 tests
|
||||
create table t1;
|
||||
ERROR 42000: A table must have at least 1 column
|
||||
|
@ -116,7 +116,7 @@ hex(a) STRCMP(a,'a') STRCMP(a,'a ')
|
||||
DROP TABLE t1;
|
||||
select insert('txs',2,1,'hi'),insert('is ',4,0,'a'),insert('txxxxt',2,4,'es');
|
||||
insert('txs',2,1,'hi') insert('is ',4,0,'a') insert('txxxxt',2,4,'es')
|
||||
this is a test
|
||||
this is test
|
||||
select insert("aa",100,1,"b"),insert("aa",1,3,"b");
|
||||
insert("aa",100,1,"b") insert("aa",1,3,"b")
|
||||
aa b
|
||||
@ -5370,9 +5370,10 @@ SET sql_mode=default;
|
||||
SET NAMES utf8;
|
||||
CREATE TABLE t1 (a INT);
|
||||
INSERT INTO t1 VALUES (0), (0), (1), (0), (0);
|
||||
SELECT COUNT(*) FROM t1, t1 t2
|
||||
SELECT COUNT(*) FROM t1, t1 t2
|
||||
GROUP BY INSERT('', t2.a, t1.a, (@@global.max_binlog_size));
|
||||
ERROR 23000: Duplicate entry '107374182410737418241' for key 'group_key'
|
||||
COUNT(*)
|
||||
25
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# Bug#11764503 (Bug#57341) Query in EXPLAIN EXTENDED shows wrong characters
|
||||
|
@ -116,7 +116,7 @@ hex(a) STRCMP(a,'a') STRCMP(a,'a ')
|
||||
DROP TABLE t1;
|
||||
select insert('txs',2,1,'hi'),insert('is ',4,0,'a'),insert('txxxxt',2,4,'es');
|
||||
insert('txs',2,1,'hi') insert('is ',4,0,'a') insert('txxxxt',2,4,'es')
|
||||
this is a test
|
||||
this is test
|
||||
select insert("aa",100,1,"b"),insert("aa",1,3,"b");
|
||||
insert("aa",100,1,"b") insert("aa",1,3,"b")
|
||||
aa b
|
||||
|
@ -116,7 +116,7 @@ hex(a) STRCMP(a,'a') STRCMP(a,'a ')
|
||||
DROP TABLE t1;
|
||||
select insert('txs',2,1,'hi'),insert('is ',4,0,'a'),insert('txxxxt',2,4,'es');
|
||||
insert('txs',2,1,'hi') insert('is ',4,0,'a') insert('txxxxt',2,4,'es')
|
||||
this is a test
|
||||
this is test
|
||||
select insert("aa",100,1,"b"),insert("aa",1,3,"b");
|
||||
insert("aa",100,1,"b") insert("aa",1,3,"b")
|
||||
aa b
|
||||
|
@ -116,7 +116,7 @@ hex(a) STRCMP(a,'a') STRCMP(a,'a ')
|
||||
DROP TABLE t1;
|
||||
select insert('txs',2,1,'hi'),insert('is ',4,0,'a'),insert('txxxxt',2,4,'es');
|
||||
insert('txs',2,1,'hi') insert('is ',4,0,'a') insert('txxxxt',2,4,'es')
|
||||
this is a test
|
||||
this is test
|
||||
select insert("aa",100,1,"b"),insert("aa",1,3,"b");
|
||||
insert("aa",100,1,"b") insert("aa",1,3,"b")
|
||||
aa b
|
||||
|
@ -116,7 +116,7 @@ hex(a) STRCMP(a,'a') STRCMP(a,'a ')
|
||||
DROP TABLE t1;
|
||||
select insert('txs',2,1,'hi'),insert('is ',4,0,'a'),insert('txxxxt',2,4,'es');
|
||||
insert('txs',2,1,'hi') insert('is ',4,0,'a') insert('txxxxt',2,4,'es')
|
||||
this is a test
|
||||
this is test
|
||||
select insert("aa",100,1,"b"),insert("aa",1,3,"b");
|
||||
insert("aa",100,1,"b") insert("aa",1,3,"b")
|
||||
aa b
|
||||
|
@ -604,4 +604,349 @@ select x.id, message from (select id from t1) x left join
|
||||
where coalesce(message,0) <> 0;
|
||||
id message
|
||||
drop table t1,t2;
|
||||
#
|
||||
# MDEV-7827: Assertion `!table || (!table->read_set ||
|
||||
# bitmap_is_set(table->read_set, field_index))' failed
|
||||
# in Field_long::val_str on EXPLAIN EXTENDED
|
||||
#
|
||||
CREATE TABLE t1 (f1 INT, f2 INT, KEY(f2)) ENGINE=MyISAM;
|
||||
INSERT INTO t1 VALUES (6,9);
|
||||
CREATE TABLE t2 (f3 INT) ENGINE=MyISAM;
|
||||
INSERT INTO t2 VALUES (2),(0);
|
||||
EXPLAIN EXTENDED
|
||||
SELECT f1 FROM ( SELECT * FROM t1 ) AS sq
|
||||
WHERE f1 IN (
|
||||
SELECT f3 FROM t2 WHERE f2 IN (
|
||||
SELECT f3 FROM t2 HAVING f3 >= 8
|
||||
)
|
||||
);
|
||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||
1 PRIMARY <derived2> system NULL NULL NULL NULL 1 100.00
|
||||
1 PRIMARY <subquery4> eq_ref distinct_key distinct_key 4 sq.f2 1 100.00
|
||||
1 PRIMARY t2 ALL NULL NULL NULL NULL 2 100.00 Using where; FirstMatch(<subquery4>); Using join buffer (flat, BNL join)
|
||||
4 MATERIALIZED t2 ALL NULL NULL NULL NULL 2 100.00
|
||||
2 DERIVED t1 system NULL NULL NULL NULL 1 100.00
|
||||
Warnings:
|
||||
Note 1276 Field or reference 'sq.f2' of SELECT #3 was resolved in SELECT #1
|
||||
Note 1003 select 6 AS `f1` from <materialize> (select `test`.`t2`.`f3` from `test`.`t2` having (`test`.`t2`.`f3` >= 8)) semi join (`test`.`t2`) where ((`test`.`t2`.`f3` = 6) and (9 = `<subquery4>`.`f3`))
|
||||
DROP TABLE t2,t1;
|
||||
#
|
||||
# MDEV-9462: Out of memory using explain on 2 empty tables
|
||||
#
|
||||
CREATE TABLE `t1` (
|
||||
`REC_GROUP` char(2) DEFAULT NULL,
|
||||
`CLIENT_INFO` text CHARACTER SET utf8,
|
||||
`NAME` text,
|
||||
`PHONE_NUMBER` text,
|
||||
`ATTENTION_NAME` text,
|
||||
`PAYMENT_TERM` text CHARACTER SET utf8,
|
||||
`CREDIT_LIMIT` decimal(12,2) DEFAULT NULL,
|
||||
`LAST_PAY_DATE` text CHARACTER SET utf8,
|
||||
`TOTAL` double DEFAULT NULL,
|
||||
`TOTAL_MCL` double DEFAULT NULL,
|
||||
`TOTAL_MFS` double DEFAULT NULL,
|
||||
`TOTAL_MIS` double DEFAULT NULL,
|
||||
`BEFORE_DUE_7_MCL` double DEFAULT NULL,
|
||||
`BEFORE_DUE_7_MFS` double DEFAULT NULL,
|
||||
`BEFORE_DUE_7_MIS` double DEFAULT NULL,
|
||||
`PER1_MCL` double DEFAULT NULL,
|
||||
`PER1_MFS` double DEFAULT NULL,
|
||||
`PER1_MIS` double DEFAULT NULL,
|
||||
`PER2_MCL` double DEFAULT NULL,
|
||||
`PER2_MFS` double DEFAULT NULL,
|
||||
`PER2_MIS` double DEFAULT NULL,
|
||||
`PER3_MCL` double DEFAULT NULL,
|
||||
`PER3_MFS` double DEFAULT NULL,
|
||||
`PER3_MIS` double DEFAULT NULL,
|
||||
`PER4_MCL` double DEFAULT NULL,
|
||||
`PER4_MFS` double DEFAULT NULL,
|
||||
`PER4_MIS` double DEFAULT NULL,
|
||||
`PER5_MCL` double DEFAULT NULL,
|
||||
`PER5_MFS` double DEFAULT NULL,
|
||||
`PER5_MIS` double DEFAULT NULL,
|
||||
`PER6_MCL` double DEFAULT NULL,
|
||||
`PER6_MFS` double DEFAULT NULL,
|
||||
`PER6_MIS` double DEFAULT NULL,
|
||||
`PER7_MCL` double DEFAULT NULL,
|
||||
`PER7_MFS` double DEFAULT NULL,
|
||||
`PER7_MIS` double DEFAULT NULL,
|
||||
`BEFORE_DUE_7` double DEFAULT NULL,
|
||||
`PER1` double DEFAULT NULL,
|
||||
`PER2` double DEFAULT NULL,
|
||||
`PER3` double DEFAULT NULL,
|
||||
`PER4` double DEFAULT NULL,
|
||||
`PER5` double DEFAULT NULL,
|
||||
`PER6` double DEFAULT NULL,
|
||||
`PER7` double DEFAULT NULL,
|
||||
`REF` varchar(30) DEFAULT NULL,
|
||||
`TYPE` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL
|
||||
);
|
||||
CREATE TABLE `t2` (
|
||||
`RECEIVABLE_GROUP` char(2) DEFAULT NULL,
|
||||
`CLIENT_NUMBER` varchar(35) DEFAULT NULL,
|
||||
`CLIENT_NAME` varchar(73) DEFAULT NULL,
|
||||
`PHONE_NUMBER` char(12) DEFAULT NULL,
|
||||
`ATTENTION_NAME` char(26) DEFAULT NULL,
|
||||
`PAYMENT_TERM` varchar(26) CHARACTER SET utf8 DEFAULT NULL,
|
||||
`CREDIT_LIMIT` decimal(12,2) DEFAULT NULL,
|
||||
`LAST_PAY_DATE` varchar(42) CHARACTER SET utf8 DEFAULT NULL,
|
||||
`TOTAL` decimal(12,2) DEFAULT NULL,
|
||||
`BEFORE_DUE_7` decimal(12,2) DEFAULT NULL,
|
||||
`PER1` decimal(12,2) DEFAULT NULL,
|
||||
`PER2` decimal(12,2) DEFAULT NULL,
|
||||
`PER3` decimal(12,2) DEFAULT NULL,
|
||||
`PER4` decimal(12,2) DEFAULT NULL,
|
||||
`PER5` decimal(12,2) DEFAULT NULL,
|
||||
`PER6` decimal(12,2) DEFAULT NULL,
|
||||
`PER7` decimal(12,2) DEFAULT NULL,
|
||||
`DIVISION` varchar(3) CHARACTER SET utf8 NOT NULL,
|
||||
`CLIENT_INFO` varchar(294) CHARACTER SET utf8 DEFAULT NULL,
|
||||
`EXCHANGE_RATE` double NOT NULL,
|
||||
`REF` varchar(30) DEFAULT NULL
|
||||
);
|
||||
explain
|
||||
SELECT A.RECEIVABLE_GROUP,A.CLIENT_INFO,A.CLIENT_NAME,A.PHONE_NUMBER,A.ATTENTION_NAME,A.PAYMENT_TERM,A.CREDIT_LIMIT,A.LAST_PAY_DATE,A.TOTAL,
|
||||
COALESCE(B.TOTAL_MCL,0) AS TOTAL_MCL,
|
||||
COALESCE(C.TOTAL_MFS,0) AS TOTAL_MFS,
|
||||
COALESCE(D.TOTAL_MIS,0) AS TOTAL_MIS,
|
||||
COALESCE(F.BEFORE_DUE_7_MCL,0) AS BEFORE_DUE_7_MCL,
|
||||
COALESCE(G.BEFORE_DUE_7_MFS,0) AS BEFORE_DUE_7_MFS,
|
||||
COALESCE(H.BEFORE_DUE_7_MIS,0) AS BEFORE_DUE_7_MIS,
|
||||
COALESCE(I.PER1_MCL,0) AS PER1_MCL,
|
||||
COALESCE(J.PER1_MFS,0) AS PER1_MFS,
|
||||
COALESCE(K.PER1_MIS,0) AS PER1_MIS,
|
||||
COALESCE(L.PER2_MCL,0) AS PER2_MCL,
|
||||
COALESCE(M.PER2_MFS,0) AS PER2_MFS,
|
||||
COALESCE(N.PER2_MIS,0) AS PER2_MIS,
|
||||
COALESCE(O.PER3_MCL,0) AS PER3_MCL,
|
||||
COALESCE(P.PER3_MFS,0) AS PER3_MFS,
|
||||
COALESCE(R.PER3_MIS,0) AS PER3_MIS,
|
||||
COALESCE(S.PER4_MCL,0) AS PER4_MCL,
|
||||
COALESCE(T.PER4_MFS,0) AS PER4_MFS,
|
||||
COALESCE(U.PER4_MIS,0) AS PER4_MIS,
|
||||
COALESCE(V.PER5_MCL,0) AS PER5_MCL,
|
||||
COALESCE(X.PER5_MFS,0) AS PER5_MFS,
|
||||
COALESCE(Z.PER5_MIS,0) AS PER5_MIS,
|
||||
COALESCE(Q.PER6_MCL,0) AS PER6_MCL,
|
||||
COALESCE(Y.PER6_MFS,0) AS PER6_MFS,
|
||||
COALESCE(W.PER6_MIS,0) AS PER6_MIS,
|
||||
COALESCE(A1.PER7_MCL,0) AS PER7_MCL,
|
||||
COALESCE(B1.PER7_MFS,0) AS PER7_MFS,
|
||||
COALESCE(C1.PER7_MIS,0) AS PER7_MIS,
|
||||
A.BEFORE_DUE_7,A.PER1,A.PER2,A.PER3,A.PER4,A.PER5,A.PER6,A.PER7,
|
||||
CONCAT(A.DIVISION,'-',A.CLIENT_NUMBER) AS REF,"2" AS TYPE FROM
|
||||
(SELECT RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,
|
||||
GROUP_CONCAT(DISTINCT CLIENT_INFO SEPARATOR '<br>') AS CLIENT_INFO,
|
||||
GROUP_CONCAT(DISTINCT CLIENT_NAME SEPARATOR '<br>') AS CLIENT_NAME,
|
||||
GROUP_CONCAT( DISTINCT `PHONE_NUMBER` SEPARATOR '<br>' ) AS PHONE_NUMBER ,
|
||||
GROUP_CONCAT( DISTINCT `ATTENTION_NAME` SEPARATOR '<br>' ) AS ATTENTION_NAME,
|
||||
GROUP_CONCAT( DISTINCT `PAYMENT_TERM` SEPARATOR '<br>' ) AS PAYMENT_TERM,
|
||||
CREDIT_LIMIT ,
|
||||
GROUP_CONCAT( `LAST_PAY_DATE` SEPARATOR '<br>' ) AS LAST_PAY_DATE,
|
||||
SUM( `TOTAL`*EXCHANGE_RATE ) AS TOTAL,
|
||||
SUM( `BEFORE_DUE_7`*EXCHANGE_RATE ) AS BEFORE_DUE_7,
|
||||
SUM( `PER1`*EXCHANGE_RATE ) AS PER1,
|
||||
SUM( `PER2`*EXCHANGE_RATE ) AS PER2,
|
||||
SUM( `PER3`*EXCHANGE_RATE ) AS PER3,
|
||||
SUM( `PER4`*EXCHANGE_RATE ) AS PER4,
|
||||
SUM( `PER5`*EXCHANGE_RATE ) AS PER5,
|
||||
SUM( `PER6`*EXCHANGE_RATE ) AS PER6,
|
||||
SUM( `PER7`*EXCHANGE_RATE ) AS PER7
|
||||
FROM `t2`
|
||||
WHERE REF IS NULL GROUP BY RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT) AS A
|
||||
LEFT JOIN
|
||||
(SELECT RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT,SUM( `TOTAL`*EXCHANGE_RATE ) AS TOTAL_MCL
|
||||
FROM `t2`
|
||||
WHERE REF IS NULL AND DIVISION="MCL" GROUP BY RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT) AS B ON A.CLIENT_NUMBER=B.CLIENT_NUMBER AND
|
||||
A.DIVISION=B.DIVISION AND A.RECEIVABLE_GROUP=B.RECEIVABLE_GROUP AND A.CREDIT_LIMIT=B.CREDIT_LIMIT
|
||||
LEFT JOIN
|
||||
(SELECT RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT,SUM( `TOTAL`*EXCHANGE_RATE ) AS TOTAL_MFS
|
||||
FROM `t2`
|
||||
WHERE REF IS NULL AND DIVISION="MFS" GROUP BY RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT) AS C ON A.CLIENT_NUMBER=C.CLIENT_NUMBER
|
||||
AND
|
||||
A.DIVISION=C.DIVISION AND A.RECEIVABLE_GROUP=C.RECEIVABLE_GROUP AND A.CREDIT_LIMIT=C.CREDIT_LIMIT
|
||||
LEFT JOIN
|
||||
(SELECT RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT,SUM( `TOTAL`*EXCHANGE_RATE ) AS TOTAL_MIS
|
||||
FROM `t2`
|
||||
WHERE REF IS NULL AND DIVISION="MIS" GROUP BY RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT) AS D ON A.CLIENT_NUMBER=D.CLIENT_NUMBER AND
|
||||
A.DIVISION=D.DIVISION AND A.RECEIVABLE_GROUP=D.RECEIVABLE_GROUP AND A.CREDIT_LIMIT=D.CREDIT_LIMIT
|
||||
LEFT JOIN
|
||||
(SELECT RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT,SUM( BEFORE_DUE_7*EXCHANGE_RATE ) AS BEFORE_DUE_7_MCL
|
||||
FROM `t2`
|
||||
WHERE REF IS NULL AND DIVISION="MCL" GROUP BY RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT) AS F ON A.CLIENT_NUMBER=F.CLIENT_NUMBER AND
|
||||
A.DIVISION=F.DIVISION AND A.RECEIVABLE_GROUP=F.RECEIVABLE_GROUP AND A.CREDIT_LIMIT=F.CREDIT_LIMIT
|
||||
LEFT JOIN
|
||||
(SELECT RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT,SUM( BEFORE_DUE_7*EXCHANGE_RATE ) AS BEFORE_DUE_7_MFS
|
||||
FROM `t2`
|
||||
WHERE REF IS NULL AND DIVISION="MFS" GROUP BY RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT) AS G ON A.CLIENT_NUMBER=G.CLIENT_NUMBER AND
|
||||
A.DIVISION=G.DIVISION AND A.RECEIVABLE_GROUP=G.RECEIVABLE_GROUP AND A.CREDIT_LIMIT=G.CREDIT_LIMIT
|
||||
LEFT JOIN
|
||||
(SELECT RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT,SUM( BEFORE_DUE_7*EXCHANGE_RATE ) AS BEFORE_DUE_7_MIS
|
||||
FROM `t2`
|
||||
WHERE REF IS NULL AND DIVISION="MIS" GROUP BY RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT) AS H ON A.CLIENT_NUMBER=H.CLIENT_NUMBER AND
|
||||
A.DIVISION=H.DIVISION AND A.RECEIVABLE_GROUP=H.RECEIVABLE_GROUP AND A.CREDIT_LIMIT=H.CREDIT_LIMIT
|
||||
LEFT JOIN
|
||||
(SELECT RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT,SUM( PER1*EXCHANGE_RATE ) AS PER1_MCL
|
||||
FROM `t2`
|
||||
WHERE REF IS NULL AND DIVISION="MCL" GROUP BY RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT) AS I ON A.CLIENT_NUMBER=I.CLIENT_NUMBER AND
|
||||
A.DIVISION=I.DIVISION AND A.RECEIVABLE_GROUP=I.RECEIVABLE_GROUP AND A.CREDIT_LIMIT=I.CREDIT_LIMIT
|
||||
LEFT JOIN
|
||||
(SELECT RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT,SUM( PER1*EXCHANGE_RATE ) AS PER1_MFS
|
||||
FROM `t2`
|
||||
WHERE REF IS NULL AND DIVISION="MFS" GROUP BY RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT) AS J ON A.CLIENT_NUMBER=J.CLIENT_NUMBER AND
|
||||
A.DIVISION=J.DIVISION AND A.RECEIVABLE_GROUP=J.RECEIVABLE_GROUP AND A.CREDIT_LIMIT=J.CREDIT_LIMIT
|
||||
LEFT JOIN
|
||||
(SELECT RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT,SUM( PER1*EXCHANGE_RATE ) AS PER1_MIS
|
||||
FROM `t2`
|
||||
WHERE REF IS NULL AND DIVISION="MIS" GROUP BY RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT) AS K ON A.CLIENT_NUMBER=K.CLIENT_NUMBER AND
|
||||
A.DIVISION=K.DIVISION AND A.RECEIVABLE_GROUP=K.RECEIVABLE_GROUP AND A.CREDIT_LIMIT=K.CREDIT_LIMIT
|
||||
LEFT JOIN
|
||||
(SELECT RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT,SUM( PER2*EXCHANGE_RATE ) AS PER2_MCL
|
||||
FROM `t2`
|
||||
WHERE REF IS NULL AND DIVISION="MCL" GROUP BY RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT) AS L ON A.CLIENT_NUMBER=L.CLIENT_NUMBER AND
|
||||
A.DIVISION=L.DIVISION AND A.RECEIVABLE_GROUP=L.RECEIVABLE_GROUP AND A.CREDIT_LIMIT=L.CREDIT_LIMIT
|
||||
LEFT JOIN
|
||||
(SELECT RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT,SUM( PER2*EXCHANGE_RATE ) AS PER2_MFS
|
||||
FROM `t2`
|
||||
WHERE REF IS NULL AND DIVISION="MFS" GROUP BY RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT) AS M ON A.CLIENT_NUMBER=M.CLIENT_NUMBER AND
|
||||
A.DIVISION=M.DIVISION AND A.RECEIVABLE_GROUP=M.RECEIVABLE_GROUP AND A.CREDIT_LIMIT=M.CREDIT_LIMIT
|
||||
LEFT JOIN
|
||||
(SELECT RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT,SUM( PER2*EXCHANGE_RATE ) AS PER2_MIS
|
||||
FROM `t2`
|
||||
WHERE REF IS NULL AND DIVISION="MIS" GROUP BY RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT) AS N ON A.CLIENT_NUMBER=N.CLIENT_NUMBER AND
|
||||
A.DIVISION=N.DIVISION AND A.RECEIVABLE_GROUP=N.RECEIVABLE_GROUP AND A.CREDIT_LIMIT=N.CREDIT_LIMIT
|
||||
LEFT JOIN
|
||||
(SELECT RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT,SUM( PER3*EXCHANGE_RATE ) AS PER3_MCL
|
||||
FROM `t2`
|
||||
WHERE REF IS NULL AND DIVISION="MCL" GROUP BY RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT) AS O ON A.CLIENT_NUMBER=O.CLIENT_NUMBER AND
|
||||
A.DIVISION=O.DIVISION AND A.RECEIVABLE_GROUP=O.RECEIVABLE_GROUP AND A.CREDIT_LIMIT=O.CREDIT_LIMIT
|
||||
LEFT JOIN
|
||||
(SELECT RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT,SUM( PER3*EXCHANGE_RATE ) AS PER3_MFS
|
||||
FROM `t2`
|
||||
WHERE REF IS NULL AND DIVISION="MFS" GROUP BY RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT) AS P ON A.CLIENT_NUMBER=P.CLIENT_NUMBER AND
|
||||
A.DIVISION=P.DIVISION AND A.RECEIVABLE_GROUP=P.RECEIVABLE_GROUP AND A.CREDIT_LIMIT=P.CREDIT_LIMIT
|
||||
LEFT JOIN
|
||||
(SELECT RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT,SUM( PER3*EXCHANGE_RATE ) AS PER3_MIS
|
||||
FROM `t2`
|
||||
WHERE REF IS NULL AND DIVISION="MIS" GROUP BY RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT) AS R ON A.CLIENT_NUMBER=R.CLIENT_NUMBER AND
|
||||
A.DIVISION=R.DIVISION AND A.RECEIVABLE_GROUP=R.RECEIVABLE_GROUP AND A.CREDIT_LIMIT=R.CREDIT_LIMIT
|
||||
LEFT JOIN
|
||||
(SELECT RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT,SUM( PER4*EXCHANGE_RATE ) AS PER4_MCL
|
||||
FROM `t2`
|
||||
WHERE REF IS NULL AND DIVISION="MCL" GROUP BY RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT) AS S ON A.CLIENT_NUMBER=S.CLIENT_NUMBER AND
|
||||
A.DIVISION=S.DIVISION AND A.RECEIVABLE_GROUP=S.RECEIVABLE_GROUP AND A.CREDIT_LIMIT=S.CREDIT_LIMIT
|
||||
LEFT JOIN
|
||||
(SELECT RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT,SUM( PER4*EXCHANGE_RATE ) AS PER4_MFS
|
||||
FROM `t2`
|
||||
WHERE REF IS NULL AND DIVISION="MFS" GROUP BY RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT) AS T ON A.CLIENT_NUMBER=T.CLIENT_NUMBER AND
|
||||
A.DIVISION=T.DIVISION AND A.RECEIVABLE_GROUP=T.RECEIVABLE_GROUP AND A.CREDIT_LIMIT=T.CREDIT_LIMIT
|
||||
LEFT JOIN
|
||||
(SELECT RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT,SUM( PER4*EXCHANGE_RATE ) AS PER4_MIS
|
||||
FROM `t2`
|
||||
WHERE REF IS NULL AND DIVISION="MIS" GROUP BY RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT) AS U ON A.CLIENT_NUMBER=U.CLIENT_NUMBER AND
|
||||
A.DIVISION=U.DIVISION AND A.RECEIVABLE_GROUP=U.RECEIVABLE_GROUP AND A.CREDIT_LIMIT=U.CREDIT_LIMIT
|
||||
LEFT JOIN
|
||||
(SELECT RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT,SUM( PER5*EXCHANGE_RATE ) AS PER5_MCL
|
||||
FROM `t2`
|
||||
WHERE REF IS NULL AND DIVISION="MCL" GROUP BY RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT) AS V ON A.CLIENT_NUMBER=V.CLIENT_NUMBER AND
|
||||
A.DIVISION=V.DIVISION AND A.RECEIVABLE_GROUP=V.RECEIVABLE_GROUP AND A.CREDIT_LIMIT=V.CREDIT_LIMIT
|
||||
LEFT JOIN
|
||||
(SELECT RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT,SUM( PER5*EXCHANGE_RATE ) AS PER5_MFS
|
||||
FROM `t2`
|
||||
WHERE REF IS NULL AND DIVISION="MFS" GROUP BY RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT) AS X ON A.CLIENT_NUMBER=X.CLIENT_NUMBER AND
|
||||
A.DIVISION=X.DIVISION AND A.RECEIVABLE_GROUP=X.RECEIVABLE_GROUP AND A.CREDIT_LIMIT=X.CREDIT_LIMIT
|
||||
LEFT JOIN
|
||||
(SELECT RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT,SUM( PER5*EXCHANGE_RATE ) AS PER5_MIS
|
||||
FROM `t2`
|
||||
WHERE REF IS NULL AND DIVISION="MIS" GROUP BY RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT) AS Z ON A.CLIENT_NUMBER=Z.CLIENT_NUMBER AND
|
||||
A.DIVISION=Z.DIVISION AND A.RECEIVABLE_GROUP=Z.RECEIVABLE_GROUP AND A.CREDIT_LIMIT=Z.CREDIT_LIMIT
|
||||
LEFT JOIN
|
||||
(SELECT RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT,SUM( PER6*EXCHANGE_RATE ) AS PER6_MCL
|
||||
FROM `t2`
|
||||
WHERE REF IS NULL AND DIVISION="MCL" GROUP BY RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT) AS Q ON A.CLIENT_NUMBER=Q.CLIENT_NUMBER AND
|
||||
A.DIVISION=Q.DIVISION AND A.RECEIVABLE_GROUP=Q.RECEIVABLE_GROUP AND A.CREDIT_LIMIT=Q.CREDIT_LIMIT
|
||||
LEFT JOIN
|
||||
(SELECT RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT,SUM( PER6*EXCHANGE_RATE ) AS PER6_MFS
|
||||
FROM `t2`
|
||||
WHERE REF IS NULL AND DIVISION="MFS" GROUP BY RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT) AS Y ON A.CLIENT_NUMBER=Y.CLIENT_NUMBER AND
|
||||
A.DIVISION=Y.DIVISION AND A.RECEIVABLE_GROUP=Y.RECEIVABLE_GROUP AND A.CREDIT_LIMIT=Y.CREDIT_LIMIT
|
||||
LEFT JOIN
|
||||
(SELECT RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT,SUM( PER6*EXCHANGE_RATE ) AS PER6_MIS
|
||||
FROM `t2`
|
||||
WHERE REF IS NULL AND DIVISION="MIS" GROUP BY RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT) AS W ON A.CLIENT_NUMBER=W.CLIENT_NUMBER AND
|
||||
A.DIVISION=W.DIVISION AND A.RECEIVABLE_GROUP=W.RECEIVABLE_GROUP AND A.CREDIT_LIMIT=W.CREDIT_LIMIT
|
||||
LEFT JOIN
|
||||
(SELECT RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT,SUM( PER7*EXCHANGE_RATE ) AS PER7_MCL
|
||||
FROM `t2`
|
||||
WHERE REF IS NULL AND DIVISION="MCL" GROUP BY RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT) AS A1 ON A.CLIENT_NUMBER=A1.CLIENT_NUMBER AND
|
||||
A.DIVISION=A1.DIVISION AND A.RECEIVABLE_GROUP=A1.RECEIVABLE_GROUP AND A.CREDIT_LIMIT=A1.CREDIT_LIMIT
|
||||
LEFT JOIN
|
||||
(SELECT RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT,SUM( PER7*EXCHANGE_RATE ) AS PER7_MFS
|
||||
FROM `t2`
|
||||
WHERE REF IS NULL AND DIVISION="MFS" GROUP BY RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT) AS B1 ON A.CLIENT_NUMBER=B1.CLIENT_NUMBER AND
|
||||
A.DIVISION=B1.DIVISION AND A.RECEIVABLE_GROUP=B1.RECEIVABLE_GROUP AND A.CREDIT_LIMIT=B1.CREDIT_LIMIT
|
||||
LEFT JOIN
|
||||
(SELECT RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT,SUM( PER7*EXCHANGE_RATE ) AS PER7_MIS
|
||||
FROM `t2`
|
||||
WHERE REF IS NULL AND DIVISION="MIS" GROUP BY RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT) AS C1 ON A.CLIENT_NUMBER=C1.CLIENT_NUMBER AND
|
||||
A.DIVISION=C1.DIVISION AND A.RECEIVABLE_GROUP=C1.RECEIVABLE_GROUP AND A.CREDIT_LIMIT=C1.CREDIT_LIMIT
|
||||
ORDER BY TOTAL DESC;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY <derived2> system NULL NULL NULL NULL 0 const row not found
|
||||
1 PRIMARY <derived3> system NULL NULL NULL NULL 0 const row not found
|
||||
1 PRIMARY <derived4> system NULL NULL NULL NULL 0 const row not found
|
||||
1 PRIMARY <derived5> system NULL NULL NULL NULL 0 const row not found
|
||||
1 PRIMARY <derived6> system NULL NULL NULL NULL 0 const row not found
|
||||
1 PRIMARY <derived7> system NULL NULL NULL NULL 0 const row not found
|
||||
1 PRIMARY <derived8> system NULL NULL NULL NULL 0 const row not found
|
||||
1 PRIMARY <derived9> system NULL NULL NULL NULL 0 const row not found
|
||||
1 PRIMARY <derived10> system NULL NULL NULL NULL 0 const row not found
|
||||
1 PRIMARY <derived11> system NULL NULL NULL NULL 0 const row not found
|
||||
1 PRIMARY <derived12> system NULL NULL NULL NULL 0 const row not found
|
||||
1 PRIMARY <derived13> system NULL NULL NULL NULL 0 const row not found
|
||||
1 PRIMARY <derived14> system NULL NULL NULL NULL 0 const row not found
|
||||
1 PRIMARY <derived15> system NULL NULL NULL NULL 0 const row not found
|
||||
1 PRIMARY <derived16> system NULL NULL NULL NULL 0 const row not found
|
||||
1 PRIMARY <derived17> system NULL NULL NULL NULL 0 const row not found
|
||||
1 PRIMARY <derived18> system NULL NULL NULL NULL 0 const row not found
|
||||
1 PRIMARY <derived19> system NULL NULL NULL NULL 0 const row not found
|
||||
1 PRIMARY <derived20> system NULL NULL NULL NULL 0 const row not found
|
||||
1 PRIMARY <derived21> system NULL NULL NULL NULL 0 const row not found
|
||||
1 PRIMARY <derived22> system NULL NULL NULL NULL 0 const row not found
|
||||
1 PRIMARY <derived23> system NULL NULL NULL NULL 0 const row not found
|
||||
1 PRIMARY <derived24> system NULL NULL NULL NULL 0 const row not found
|
||||
1 PRIMARY <derived25> system NULL NULL NULL NULL 0 const row not found
|
||||
1 PRIMARY <derived26> system NULL NULL NULL NULL 0 const row not found
|
||||
1 PRIMARY <derived27> system NULL NULL NULL NULL 0 const row not found
|
||||
1 PRIMARY <derived28> system NULL NULL NULL NULL 0 const row not found
|
||||
1 PRIMARY <derived29> system NULL NULL NULL NULL 0 const row not found
|
||||
29 DERIVED NULL NULL NULL NULL NULL NULL NULL no matching row in const table
|
||||
28 DERIVED NULL NULL NULL NULL NULL NULL NULL no matching row in const table
|
||||
27 DERIVED NULL NULL NULL NULL NULL NULL NULL no matching row in const table
|
||||
26 DERIVED NULL NULL NULL NULL NULL NULL NULL no matching row in const table
|
||||
25 DERIVED NULL NULL NULL NULL NULL NULL NULL no matching row in const table
|
||||
24 DERIVED NULL NULL NULL NULL NULL NULL NULL no matching row in const table
|
||||
23 DERIVED NULL NULL NULL NULL NULL NULL NULL no matching row in const table
|
||||
22 DERIVED NULL NULL NULL NULL NULL NULL NULL no matching row in const table
|
||||
21 DERIVED NULL NULL NULL NULL NULL NULL NULL no matching row in const table
|
||||
20 DERIVED NULL NULL NULL NULL NULL NULL NULL no matching row in const table
|
||||
19 DERIVED NULL NULL NULL NULL NULL NULL NULL no matching row in const table
|
||||
18 DERIVED NULL NULL NULL NULL NULL NULL NULL no matching row in const table
|
||||
17 DERIVED NULL NULL NULL NULL NULL NULL NULL no matching row in const table
|
||||
16 DERIVED NULL NULL NULL NULL NULL NULL NULL no matching row in const table
|
||||
15 DERIVED NULL NULL NULL NULL NULL NULL NULL no matching row in const table
|
||||
14 DERIVED NULL NULL NULL NULL NULL NULL NULL no matching row in const table
|
||||
13 DERIVED NULL NULL NULL NULL NULL NULL NULL no matching row in const table
|
||||
12 DERIVED NULL NULL NULL NULL NULL NULL NULL no matching row in const table
|
||||
11 DERIVED NULL NULL NULL NULL NULL NULL NULL no matching row in const table
|
||||
10 DERIVED NULL NULL NULL NULL NULL NULL NULL no matching row in const table
|
||||
9 DERIVED NULL NULL NULL NULL NULL NULL NULL no matching row in const table
|
||||
8 DERIVED NULL NULL NULL NULL NULL NULL NULL no matching row in const table
|
||||
7 DERIVED NULL NULL NULL NULL NULL NULL NULL no matching row in const table
|
||||
6 DERIVED NULL NULL NULL NULL NULL NULL NULL no matching row in const table
|
||||
5 DERIVED NULL NULL NULL NULL NULL NULL NULL no matching row in const table
|
||||
4 DERIVED NULL NULL NULL NULL NULL NULL NULL no matching row in const table
|
||||
3 DERIVED NULL NULL NULL NULL NULL NULL NULL no matching row in const table
|
||||
2 DERIVED NULL NULL NULL NULL NULL NULL NULL no matching row in const table
|
||||
DROP TABLES t1,t2;
|
||||
set optimizer_switch=@save_derived_optimizer_switch;
|
||||
|
@ -203,7 +203,7 @@ CONCAT('"',CONCAT_WS('";"',repeat('a',60),repeat('b',60),repeat('c',60),repeat('
|
||||
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb";"cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc";"dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd"
|
||||
select insert('txs',2,1,'hi'),insert('is ',4,0,'a'),insert('txxxxt',2,4,'es');
|
||||
insert('txs',2,1,'hi') insert('is ',4,0,'a') insert('txxxxt',2,4,'es')
|
||||
this is a test
|
||||
this is test
|
||||
select replace('aaaa','a','b'),replace('aaaa','aa','b'),replace('aaaa','a','bb'),replace('aaaa','','b'),replace('bbbb','a','c');
|
||||
replace('aaaa','a','b') replace('aaaa','aa','b') replace('aaaa','a','bb') replace('aaaa','','b') replace('bbbb','a','c')
|
||||
bbbb bb bbbbbbbb aaaa bbbb
|
||||
@ -2335,7 +2335,7 @@ INSERT('abc', 3, 3, '1234')
|
||||
ab1234
|
||||
SELECT INSERT('abc', 4, 3, '1234');
|
||||
INSERT('abc', 4, 3, '1234')
|
||||
abc1234
|
||||
abc
|
||||
SELECT INSERT('abc', 5, 3, '1234');
|
||||
INSERT('abc', 5, 3, '1234')
|
||||
abc
|
||||
@ -2625,7 +2625,7 @@ CREATE TABLE t1 ( a TEXT );
|
||||
SELECT 'aaaaaaaaaaaaaa' INTO OUTFILE 'MYSQLTEST_VARDIR/tmp/bug58165.txt';;
|
||||
SELECT insert( substring_index( 'a', 'a', 'b' ), 1, 0, 'x' );
|
||||
insert( substring_index( 'a', 'a', 'b' ), 1, 0, 'x' )
|
||||
x
|
||||
|
||||
Warnings:
|
||||
Warning 1292 Truncated incorrect INTEGER value: 'b'
|
||||
LOAD DATA INFILE 'MYSQLTEST_VARDIR/tmp/bug58165.txt' INTO TABLE t1;;
|
||||
|
@ -1722,6 +1722,43 @@ select 1 from t1 where 1 < some (select cast(a as datetime) from t1);
|
||||
1
|
||||
1
|
||||
drop table t1;
|
||||
#
|
||||
# Bug #21564557: INCONSISTENT OUTPUT FROM 5.5 AND 5.6
|
||||
# UNIX_TIMESTAMP(STR_TO_DATE('201506', "%Y%M"
|
||||
#
|
||||
SELECT UNIX_TIMESTAMP(STR_TO_DATE('201506', "%Y%m"));
|
||||
UNIX_TIMESTAMP(STR_TO_DATE('201506', "%Y%m"))
|
||||
NULL
|
||||
Warnings:
|
||||
Warning 1411 Incorrect datetime value: '201506' for function str_to_date
|
||||
SELECT UNIX_TIMESTAMP('2015-06-00');
|
||||
UNIX_TIMESTAMP('2015-06-00')
|
||||
NULL
|
||||
Warnings:
|
||||
Warning 1292 Incorrect datetime value: '2015-06-00'
|
||||
SELECT UNIX_TIMESTAMP(STR_TO_DATE('0000-00-00 10:30:30', '%Y-%m-%d %h:%i:%s'));
|
||||
UNIX_TIMESTAMP(STR_TO_DATE('0000-00-00 10:30:30', '%Y-%m-%d %h:%i:%s'))
|
||||
NULL
|
||||
set sql_mode= 'TRADITIONAL';
|
||||
SELECT @@sql_mode;
|
||||
@@sql_mode
|
||||
STRICT_TRANS_TABLES,STRICT_ALL_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,TRADITIONAL,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
|
||||
SELECT UNIX_TIMESTAMP(STR_TO_DATE('201506', "%Y%m"));
|
||||
UNIX_TIMESTAMP(STR_TO_DATE('201506', "%Y%m"))
|
||||
NULL
|
||||
Warnings:
|
||||
Warning 1411 Incorrect datetime value: '201506' for function str_to_date
|
||||
SELECT UNIX_TIMESTAMP('2015-06-00');
|
||||
UNIX_TIMESTAMP('2015-06-00')
|
||||
NULL
|
||||
Warnings:
|
||||
Warning 1292 Incorrect datetime value: '2015-06-00'
|
||||
SELECT UNIX_TIMESTAMP(STR_TO_DATE('0000-00-00 10:30:30', '%Y-%m-%d %h:%i:%s'));
|
||||
UNIX_TIMESTAMP(STR_TO_DATE('0000-00-00 10:30:30', '%Y-%m-%d %h:%i:%s'))
|
||||
NULL
|
||||
Warnings:
|
||||
Warning 1411 Incorrect datetime value: '0000-00-00 10:30:30' for function str_to_date
|
||||
set sql_mode= default;
|
||||
select time('10:10:10') > 10;
|
||||
time('10:10:10') > 10
|
||||
1
|
||||
|
@ -35,3 +35,36 @@ c1
|
||||
Ann
|
||||
Alice
|
||||
DROP TABLE t1, t2, t3, t4, t5;
|
||||
create table t1 (c1 varchar(100));
|
||||
create table t2 (c1 varchar(100));
|
||||
create view t3 as select * from t1;
|
||||
insert into t1 values ('ann'), ('alice');
|
||||
insert into t2 values ('bob'), ('brian');
|
||||
create temporary table t4 (c1 varchar(100)) engine=MERGE union=(t2, t1);
|
||||
create temporary table t5 (c1 varchar(100)) engine=MERGE union=(t3, t1);
|
||||
select * from t5;
|
||||
ERROR HY000: Unable to open underlying table which is differently defined or of non-MyISAM type or doesn't exist
|
||||
lock tables t1 read, t2 read, t3 read, t4 read;
|
||||
select * from t5;
|
||||
ERROR HY000: Unable to open underlying table which is differently defined or of non-MyISAM type or doesn't exist
|
||||
select * from t4;
|
||||
c1
|
||||
bob
|
||||
brian
|
||||
ann
|
||||
alice
|
||||
unlock tables;
|
||||
drop table t2;
|
||||
create view t2 as select * from t1;
|
||||
select * from t4;
|
||||
ERROR HY000: Unable to open underlying table which is differently defined or of non-MyISAM type or doesn't exist
|
||||
lock tables t1 read, t2 read, t3 read;
|
||||
select * from t4;
|
||||
ERROR HY000: Unable to open underlying table which is differently defined or of non-MyISAM type or doesn't exist
|
||||
select * from t4;
|
||||
ERROR HY000: Unable to open underlying table which is differently defined or of non-MyISAM type or doesn't exist
|
||||
select * from t4;
|
||||
ERROR HY000: Unable to open underlying table which is differently defined or of non-MyISAM type or doesn't exist
|
||||
unlock tables;
|
||||
drop view t2, t3;
|
||||
drop table t1;
|
||||
|
@ -318,4 +318,64 @@ master-bin.000001 # Gtid # # GTID #-#-#
|
||||
master-bin.000001 # Query # # use `test`; REPAIR VIEW `v4` FROM MYSQL
|
||||
drop table if exists kv;
|
||||
drop view v1,v2,v3,v4;
|
||||
rename table mysql.event to mysql.ev_bk;
|
||||
flush tables;
|
||||
The --upgrade-system-tables option was used, user tables won't be touched.
|
||||
MySQL upgrade detected
|
||||
Phase 1/6: Checking and upgrading mysql database
|
||||
Processing databases
|
||||
mysql
|
||||
mysql.column_stats OK
|
||||
mysql.columns_priv OK
|
||||
mysql.db OK
|
||||
mysql.ev_bk OK
|
||||
mysql.event OK
|
||||
mysql.func OK
|
||||
mysql.gtid_slave_pos OK
|
||||
mysql.help_category OK
|
||||
mysql.help_keyword OK
|
||||
mysql.help_relation OK
|
||||
mysql.help_topic OK
|
||||
mysql.host OK
|
||||
mysql.index_stats OK
|
||||
mysql.innodb_index_stats
|
||||
Error : Unknown storage engine 'InnoDB'
|
||||
error : Corrupt
|
||||
mysql.innodb_table_stats
|
||||
Error : Unknown storage engine 'InnoDB'
|
||||
error : Corrupt
|
||||
mysql.plugin OK
|
||||
mysql.proc OK
|
||||
mysql.procs_priv OK
|
||||
mysql.proxies_priv OK
|
||||
mysql.roles_mapping OK
|
||||
mysql.servers OK
|
||||
mysql.table_stats OK
|
||||
mysql.tables_priv OK
|
||||
mysql.time_zone OK
|
||||
mysql.time_zone_leap_second OK
|
||||
mysql.time_zone_name OK
|
||||
mysql.time_zone_transition OK
|
||||
mysql.time_zone_transition_type OK
|
||||
mysql.user OK
|
||||
|
||||
Repairing tables
|
||||
mysql.innodb_index_stats
|
||||
Error : Unknown storage engine 'InnoDB'
|
||||
error : Corrupt
|
||||
mysql.innodb_table_stats
|
||||
Error : Unknown storage engine 'InnoDB'
|
||||
error : Corrupt
|
||||
Phase 2/6: Fixing views from mysql
|
||||
test.v1 OK
|
||||
test.v2 OK
|
||||
test.v3 OK
|
||||
Phase 3/6: Running 'mysql_fix_privilege_tables'
|
||||
Phase 4/6: Fixing table and database names ... Skipped
|
||||
Phase 5/6: Checking and upgrading tables... Skipped
|
||||
Phase 6/6: Running 'FLUSH PRIVILEGES'
|
||||
OK
|
||||
drop table mysql.event;
|
||||
rename table mysql.ev_bk to mysql.event;
|
||||
drop view v1,v2,v3;
|
||||
drop table t1;
|
||||
|
13
mysql-test/r/second_frac-9175.result
Normal file
13
mysql-test/r/second_frac-9175.result
Normal file
@ -0,0 +1,13 @@
|
||||
select timestampdiff(microsecond,'2000-01-01 00:00:00','2001-01-01 00:00:00.123456');
|
||||
timestampdiff(microsecond,'2000-01-01 00:00:00','2001-01-01 00:00:00.123456')
|
||||
31622400123456
|
||||
explain extended select timestampdiff(microsecond,'2000-01-01 00:00:00','2001-01-01 00:00:00.123456');
|
||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used
|
||||
Warnings:
|
||||
Note 1003 select timestampdiff(MICROSECOND,'2000-01-01 00:00:00','2001-01-01 00:00:00.123456') AS `timestampdiff(microsecond,'2000-01-01 00:00:00','2001-01-01 00:00:00.123456')`
|
||||
create view v1 as select timestampdiff(microsecond,'2000-01-01 00:00:00','2001-01-01 00:00:00.123456');
|
||||
select * from v1;
|
||||
Name_exp_1
|
||||
31622400123456
|
||||
drop view v1;
|
@ -4323,57 +4323,57 @@ test.t1 repair status OK
|
||||
test.t2 repair status OK
|
||||
test.t3 repair status OK
|
||||
test.v1 repair Error 'test.v1' is not BASE TABLE
|
||||
test.v1 repair error Corrupt
|
||||
test.v1 repair status Operation failed
|
||||
Table Op Msg_type Msg_text
|
||||
test.t1 optimize status OK
|
||||
test.t2 optimize status OK
|
||||
test.t3 optimize status OK
|
||||
test.v1 optimize Error 'test.v1' is not BASE TABLE
|
||||
test.v1 optimize error Corrupt
|
||||
test.v1 optimize status Operation failed
|
||||
Table Op Msg_type Msg_text
|
||||
test.t1 analyze status Table is already up to date
|
||||
test.t2 analyze status Table is already up to date
|
||||
test.t3 analyze status Table is already up to date
|
||||
test.v1 analyze Error 'test.v1' is not BASE TABLE
|
||||
test.v1 analyze error Corrupt
|
||||
test.v1 analyze status Operation failed
|
||||
call bug13012()|
|
||||
Table Op Msg_type Msg_text
|
||||
test.t1 repair status OK
|
||||
test.t2 repair status OK
|
||||
test.t3 repair status OK
|
||||
test.v1 repair Error 'test.v1' is not BASE TABLE
|
||||
test.v1 repair error Corrupt
|
||||
test.v1 repair status Operation failed
|
||||
Table Op Msg_type Msg_text
|
||||
test.t1 optimize status OK
|
||||
test.t2 optimize status OK
|
||||
test.t3 optimize status OK
|
||||
test.v1 optimize Error 'test.v1' is not BASE TABLE
|
||||
test.v1 optimize error Corrupt
|
||||
test.v1 optimize status Operation failed
|
||||
Table Op Msg_type Msg_text
|
||||
test.t1 analyze status Table is already up to date
|
||||
test.t2 analyze status Table is already up to date
|
||||
test.t3 analyze status Table is already up to date
|
||||
test.v1 analyze Error 'test.v1' is not BASE TABLE
|
||||
test.v1 analyze error Corrupt
|
||||
test.v1 analyze status Operation failed
|
||||
call bug13012()|
|
||||
Table Op Msg_type Msg_text
|
||||
test.t1 repair status OK
|
||||
test.t2 repair status OK
|
||||
test.t3 repair status OK
|
||||
test.v1 repair Error 'test.v1' is not BASE TABLE
|
||||
test.v1 repair error Corrupt
|
||||
test.v1 repair status Operation failed
|
||||
Table Op Msg_type Msg_text
|
||||
test.t1 optimize status OK
|
||||
test.t2 optimize status OK
|
||||
test.t3 optimize status OK
|
||||
test.v1 optimize Error 'test.v1' is not BASE TABLE
|
||||
test.v1 optimize error Corrupt
|
||||
test.v1 optimize status Operation failed
|
||||
Table Op Msg_type Msg_text
|
||||
test.t1 analyze status Table is already up to date
|
||||
test.t2 analyze status Table is already up to date
|
||||
test.t3 analyze status Table is already up to date
|
||||
test.v1 analyze Error 'test.v1' is not BASE TABLE
|
||||
test.v1 analyze error Corrupt
|
||||
test.v1 analyze status Operation failed
|
||||
drop procedure bug13012|
|
||||
drop view v1|
|
||||
select * from t1 order by data|
|
||||
|
5
mysql-test/r/ssl_cert_verify.result
Normal file
5
mysql-test/r/ssl_cert_verify.result
Normal file
@ -0,0 +1,5 @@
|
||||
#T1: Host name (/CN=localhost/) as OU name in the server certificate, server certificate verification should fail.
|
||||
#T2: Host name (localhost) as common name in the server certificate, server certificate verification should pass.
|
||||
Variable_name Value
|
||||
Ssl_version TLS_VERSION
|
||||
# restart server using restart
|
@ -7086,6 +7086,20 @@ NULL
|
||||
deallocate prepare stmt;
|
||||
drop table t1,t2,t3,t4;
|
||||
#
|
||||
# MDEV-7122
|
||||
# Assertion `0' failed in subselect_hash_sj_engine::init
|
||||
#
|
||||
SET SESSION big_tables=1;
|
||||
CREATE TABLE t1(a char(255) DEFAULT '', KEY(a(10))) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
|
||||
INSERT INTO t1 VALUES(0),(0),(0);
|
||||
SELECT * FROM t1 WHERE a IN(SELECT MIN(a) FROM t1);
|
||||
a
|
||||
0
|
||||
0
|
||||
0
|
||||
DROP TABLE t1;
|
||||
SET SESSION big_tables=0;
|
||||
#
|
||||
# MDEV-7930: Assertion `table_share->tmp_table != NO_TMP_TABLE ||
|
||||
# m_lock_type != 2' failed in handler::ha_index_read_map
|
||||
#
|
||||
|
@ -349,9 +349,9 @@ WHERE t.a IN (SELECT b FROM t1);
|
||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||
1 PRIMARY t1 system NULL NULL NULL NULL 1 100.00
|
||||
1 PRIMARY t2 ALL NULL NULL NULL NULL 2 100.00 Using where
|
||||
3 MATERIALIZED t1 system NULL NULL NULL NULL 1 100.00
|
||||
3 DEPENDENT SUBQUERY t1 system NULL NULL NULL NULL 1 100.00
|
||||
Warnings:
|
||||
Note 1003 select `test`.`t2`.`a` AS `a`,0 AS `a`,0 AS `b` from `test`.`t2` where <expr_cache><0>(<in_optimizer>(0,0 in ( <materialize> (select 0 from dual ), <primary_index_lookup>(0 in <temporary table> on distinct_key where ((0 = `<subquery3>`.`b`))))))
|
||||
Note 1003 select `test`.`t2`.`a` AS `a`,0 AS `a`,0 AS `b` from `test`.`t2` where <expr_cache><0>(<in_optimizer>(0,<exists>(select 0 from dual where (<cache>(0) = 0))))
|
||||
SELECT * FROM t2 RIGHT JOIN v1 AS t ON t.a != 0
|
||||
WHERE t.a IN (SELECT b FROM t1);
|
||||
a a b
|
||||
@ -362,9 +362,9 @@ WHERE t.a IN (SELECT b FROM t1);
|
||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||
1 PRIMARY t1 system NULL NULL NULL NULL 1 100.00
|
||||
1 PRIMARY t2 ALL NULL NULL NULL NULL 2 100.00 Using where
|
||||
2 MATERIALIZED t1 system NULL NULL NULL NULL 1 100.00
|
||||
2 DEPENDENT SUBQUERY t1 system NULL NULL NULL NULL 1 100.00
|
||||
Warnings:
|
||||
Note 1003 select `test`.`t2`.`a` AS `a`,0 AS `a`,0 AS `b` from `test`.`t2` where <expr_cache><0>(<in_optimizer>(0,0 in ( <materialize> (select 0 from dual ), <primary_index_lookup>(0 in <temporary table> on distinct_key where ((0 = `<subquery2>`.`b`))))))
|
||||
Note 1003 select `test`.`t2`.`a` AS `a`,0 AS `a`,0 AS `b` from `test`.`t2` where <expr_cache><0>(<in_optimizer>(0,<exists>(select 0 from dual where (<cache>(0) = 0))))
|
||||
DROP VIEW v1;
|
||||
DROP TABLE t1,t2;
|
||||
#
|
||||
|
@ -7086,6 +7086,20 @@ NULL
|
||||
deallocate prepare stmt;
|
||||
drop table t1,t2,t3,t4;
|
||||
#
|
||||
# MDEV-7122
|
||||
# Assertion `0' failed in subselect_hash_sj_engine::init
|
||||
#
|
||||
SET SESSION big_tables=1;
|
||||
CREATE TABLE t1(a char(255) DEFAULT '', KEY(a(10))) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
|
||||
INSERT INTO t1 VALUES(0),(0),(0);
|
||||
SELECT * FROM t1 WHERE a IN(SELECT MIN(a) FROM t1);
|
||||
a
|
||||
0
|
||||
0
|
||||
0
|
||||
DROP TABLE t1;
|
||||
SET SESSION big_tables=0;
|
||||
#
|
||||
# MDEV-7930: Assertion `table_share->tmp_table != NO_TMP_TABLE ||
|
||||
# m_lock_type != 2' failed in handler::ha_index_read_map
|
||||
#
|
||||
|
@ -7079,6 +7079,20 @@ NULL
|
||||
deallocate prepare stmt;
|
||||
drop table t1,t2,t3,t4;
|
||||
#
|
||||
# MDEV-7122
|
||||
# Assertion `0' failed in subselect_hash_sj_engine::init
|
||||
#
|
||||
SET SESSION big_tables=1;
|
||||
CREATE TABLE t1(a char(255) DEFAULT '', KEY(a(10))) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
|
||||
INSERT INTO t1 VALUES(0),(0),(0);
|
||||
SELECT * FROM t1 WHERE a IN(SELECT MIN(a) FROM t1);
|
||||
a
|
||||
0
|
||||
0
|
||||
0
|
||||
DROP TABLE t1;
|
||||
SET SESSION big_tables=0;
|
||||
#
|
||||
# MDEV-7930: Assertion `table_share->tmp_table != NO_TMP_TABLE ||
|
||||
# m_lock_type != 2' failed in handler::ha_index_read_map
|
||||
#
|
||||
|
@ -7077,6 +7077,20 @@ NULL
|
||||
deallocate prepare stmt;
|
||||
drop table t1,t2,t3,t4;
|
||||
#
|
||||
# MDEV-7122
|
||||
# Assertion `0' failed in subselect_hash_sj_engine::init
|
||||
#
|
||||
SET SESSION big_tables=1;
|
||||
CREATE TABLE t1(a char(255) DEFAULT '', KEY(a(10))) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
|
||||
INSERT INTO t1 VALUES(0),(0),(0);
|
||||
SELECT * FROM t1 WHERE a IN(SELECT MIN(a) FROM t1);
|
||||
a
|
||||
0
|
||||
0
|
||||
0
|
||||
DROP TABLE t1;
|
||||
SET SESSION big_tables=0;
|
||||
#
|
||||
# MDEV-7930: Assertion `table_share->tmp_table != NO_TMP_TABLE ||
|
||||
# m_lock_type != 2' failed in handler::ha_index_read_map
|
||||
#
|
||||
|
@ -7092,6 +7092,20 @@ NULL
|
||||
deallocate prepare stmt;
|
||||
drop table t1,t2,t3,t4;
|
||||
#
|
||||
# MDEV-7122
|
||||
# Assertion `0' failed in subselect_hash_sj_engine::init
|
||||
#
|
||||
SET SESSION big_tables=1;
|
||||
CREATE TABLE t1(a char(255) DEFAULT '', KEY(a(10))) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
|
||||
INSERT INTO t1 VALUES(0),(0),(0);
|
||||
SELECT * FROM t1 WHERE a IN(SELECT MIN(a) FROM t1);
|
||||
a
|
||||
0
|
||||
0
|
||||
0
|
||||
DROP TABLE t1;
|
||||
SET SESSION big_tables=0;
|
||||
#
|
||||
# MDEV-7930: Assertion `table_share->tmp_table != NO_TMP_TABLE ||
|
||||
# m_lock_type != 2' failed in handler::ha_index_read_map
|
||||
#
|
||||
|
@ -7077,6 +7077,20 @@ NULL
|
||||
deallocate prepare stmt;
|
||||
drop table t1,t2,t3,t4;
|
||||
#
|
||||
# MDEV-7122
|
||||
# Assertion `0' failed in subselect_hash_sj_engine::init
|
||||
#
|
||||
SET SESSION big_tables=1;
|
||||
CREATE TABLE t1(a char(255) DEFAULT '', KEY(a(10))) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
|
||||
INSERT INTO t1 VALUES(0),(0),(0);
|
||||
SELECT * FROM t1 WHERE a IN(SELECT MIN(a) FROM t1);
|
||||
a
|
||||
0
|
||||
0
|
||||
0
|
||||
DROP TABLE t1;
|
||||
SET SESSION big_tables=0;
|
||||
#
|
||||
# MDEV-7930: Assertion `table_share->tmp_table != NO_TMP_TABLE ||
|
||||
# m_lock_type != 2' failed in handler::ha_index_read_map
|
||||
#
|
||||
|
@ -2997,4 +2997,69 @@ explain
|
||||
select 1 from t1 where _cp932 "1" in (select '1' from t1);
|
||||
ERROR HY000: Illegal mix of collations (cp932_japanese_ci,COERCIBLE) and (latin1_swedish_ci,COERCIBLE) for operation '='
|
||||
drop table t1;
|
||||
#
|
||||
# MDEV-7823: Server crashes in next_depth_first_tab on nested IN clauses with SQ inside
|
||||
#
|
||||
set @tmp_mdev7823=@@optimizer_switch;
|
||||
set optimizer_switch=default;
|
||||
CREATE TABLE t1 (f1 INT);
|
||||
INSERT INTO t1 VALUES (1);
|
||||
CREATE TABLE t2 (f2 INT, KEY(f2));
|
||||
INSERT INTO t2 VALUES (8),(0);
|
||||
CREATE TABLE t3 (f3 INT);
|
||||
INSERT INTO t3 VALUES (1),(2);
|
||||
CREATE TABLE t4 (f4 INT);
|
||||
INSERT INTO t4 VALUES (0),(5);
|
||||
explain
|
||||
SELECT * FROM t1, t2, t3 WHERE f2 IN ( f1 IN ( SELECT f4 FROM t4 ) );
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY t1 system NULL NULL NULL NULL 1
|
||||
1 PRIMARY t2 ref f2 f2 5 const 0 Using where; Using index
|
||||
1 PRIMARY t3 ALL NULL NULL NULL NULL 2 Using join buffer (flat, BNL join)
|
||||
2 DEPENDENT SUBQUERY t4 ALL NULL NULL NULL NULL 2 Using where
|
||||
SELECT * FROM t1, t2, t3 WHERE f2 IN ( f1 IN ( SELECT f4 FROM t4 ) );
|
||||
f1 f2 f3
|
||||
1 0 1
|
||||
1 0 2
|
||||
drop table t1,t2,t3,t4;
|
||||
set optimizer_switch= @tmp_mdev7823;
|
||||
#
|
||||
# MDEV-6859: scalar subqueries in a comparison produced unexpected result
|
||||
#
|
||||
set @tmp_mdev6859=@@optimizer_switch;
|
||||
set optimizer_switch=default;
|
||||
CREATE TABLE t1 (
|
||||
project_number varchar(50) NOT NULL,
|
||||
PRIMARY KEY (project_number)
|
||||
) ENGINE=MyISAM;
|
||||
INSERT INTO t1 (project_number) VALUES ('aaa'),('bbb');
|
||||
CREATE TABLE t2 (
|
||||
id int(10) unsigned NOT NULL AUTO_INCREMENT,
|
||||
project_number varchar(50) NOT NULL,
|
||||
history_date date NOT NULL,
|
||||
country varchar(50) NOT NULL,
|
||||
PRIMARY KEY (id)
|
||||
) ENGINE=MyISAM;
|
||||
INSERT INTO t2 (id, project_number, history_date, country) VALUES
|
||||
(1, 'aaa', '2014-08-09', 'france'),(2, 'aaa', '2014-09-09', 'singapore');
|
||||
CREATE TABLE t3 (
|
||||
region varchar(50) NOT NULL,
|
||||
country varchar(50) NOT NULL
|
||||
) ENGINE=MyISAM;
|
||||
INSERT INTO t3 (region, country) VALUES ('apac', 'singapore'),('eame', 'france');
|
||||
SELECT SQL_NO_CACHE a.project_number
|
||||
FROM t1 a
|
||||
WHERE ( SELECT z.country
|
||||
FROM t2 z
|
||||
WHERE z.project_number = a.project_number AND z.history_date <= '2014-09-01'
|
||||
ORDER BY z.id DESC LIMIT 1
|
||||
) IN (
|
||||
SELECT r.country
|
||||
FROM t3 r
|
||||
WHERE r.region = 'eame'
|
||||
);
|
||||
project_number
|
||||
aaa
|
||||
drop table t1, t2, t3;
|
||||
set optimizer_switch= @tmp_mdev6859;
|
||||
set optimizer_switch=@subselect_sj_tmp;
|
||||
|
@ -3011,6 +3011,71 @@ explain
|
||||
select 1 from t1 where _cp932 "1" in (select '1' from t1);
|
||||
ERROR HY000: Illegal mix of collations (cp932_japanese_ci,COERCIBLE) and (latin1_swedish_ci,COERCIBLE) for operation '='
|
||||
drop table t1;
|
||||
#
|
||||
# MDEV-7823: Server crashes in next_depth_first_tab on nested IN clauses with SQ inside
|
||||
#
|
||||
set @tmp_mdev7823=@@optimizer_switch;
|
||||
set optimizer_switch=default;
|
||||
CREATE TABLE t1 (f1 INT);
|
||||
INSERT INTO t1 VALUES (1);
|
||||
CREATE TABLE t2 (f2 INT, KEY(f2));
|
||||
INSERT INTO t2 VALUES (8),(0);
|
||||
CREATE TABLE t3 (f3 INT);
|
||||
INSERT INTO t3 VALUES (1),(2);
|
||||
CREATE TABLE t4 (f4 INT);
|
||||
INSERT INTO t4 VALUES (0),(5);
|
||||
explain
|
||||
SELECT * FROM t1, t2, t3 WHERE f2 IN ( f1 IN ( SELECT f4 FROM t4 ) );
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY t1 system NULL NULL NULL NULL 1
|
||||
1 PRIMARY t2 ref f2 f2 5 const 0 Using where; Using index
|
||||
1 PRIMARY t3 ALL NULL NULL NULL NULL 2 Using join buffer (flat, BNL join)
|
||||
2 DEPENDENT SUBQUERY t4 ALL NULL NULL NULL NULL 2 Using where
|
||||
SELECT * FROM t1, t2, t3 WHERE f2 IN ( f1 IN ( SELECT f4 FROM t4 ) );
|
||||
f1 f2 f3
|
||||
1 0 1
|
||||
1 0 2
|
||||
drop table t1,t2,t3,t4;
|
||||
set optimizer_switch= @tmp_mdev7823;
|
||||
#
|
||||
# MDEV-6859: scalar subqueries in a comparison produced unexpected result
|
||||
#
|
||||
set @tmp_mdev6859=@@optimizer_switch;
|
||||
set optimizer_switch=default;
|
||||
CREATE TABLE t1 (
|
||||
project_number varchar(50) NOT NULL,
|
||||
PRIMARY KEY (project_number)
|
||||
) ENGINE=MyISAM;
|
||||
INSERT INTO t1 (project_number) VALUES ('aaa'),('bbb');
|
||||
CREATE TABLE t2 (
|
||||
id int(10) unsigned NOT NULL AUTO_INCREMENT,
|
||||
project_number varchar(50) NOT NULL,
|
||||
history_date date NOT NULL,
|
||||
country varchar(50) NOT NULL,
|
||||
PRIMARY KEY (id)
|
||||
) ENGINE=MyISAM;
|
||||
INSERT INTO t2 (id, project_number, history_date, country) VALUES
|
||||
(1, 'aaa', '2014-08-09', 'france'),(2, 'aaa', '2014-09-09', 'singapore');
|
||||
CREATE TABLE t3 (
|
||||
region varchar(50) NOT NULL,
|
||||
country varchar(50) NOT NULL
|
||||
) ENGINE=MyISAM;
|
||||
INSERT INTO t3 (region, country) VALUES ('apac', 'singapore'),('eame', 'france');
|
||||
SELECT SQL_NO_CACHE a.project_number
|
||||
FROM t1 a
|
||||
WHERE ( SELECT z.country
|
||||
FROM t2 z
|
||||
WHERE z.project_number = a.project_number AND z.history_date <= '2014-09-01'
|
||||
ORDER BY z.id DESC LIMIT 1
|
||||
) IN (
|
||||
SELECT r.country
|
||||
FROM t3 r
|
||||
WHERE r.region = 'eame'
|
||||
);
|
||||
project_number
|
||||
aaa
|
||||
drop table t1, t2, t3;
|
||||
set optimizer_switch= @tmp_mdev6859;
|
||||
set optimizer_switch=@subselect_sj_tmp;
|
||||
#
|
||||
# BUG#49129: Wrong result with IN-subquery with join_cache_level=6 and firstmatch=off
|
||||
|
@ -2422,28 +2422,28 @@ CREATE VIEW v1 AS SELECT id FROM t1;
|
||||
OPTIMIZE TABLE v1;
|
||||
Table Op Msg_type Msg_text
|
||||
test.v1 optimize Error 'test.v1' is not BASE TABLE
|
||||
test.v1 optimize error Corrupt
|
||||
test.v1 optimize status Operation failed
|
||||
ANALYZE TABLE v1;
|
||||
Table Op Msg_type Msg_text
|
||||
test.v1 analyze Error 'test.v1' is not BASE TABLE
|
||||
test.v1 analyze error Corrupt
|
||||
test.v1 analyze status Operation failed
|
||||
REPAIR TABLE v1;
|
||||
Table Op Msg_type Msg_text
|
||||
test.v1 repair Error 'test.v1' is not BASE TABLE
|
||||
test.v1 repair error Corrupt
|
||||
test.v1 repair status Operation failed
|
||||
DROP TABLE t1;
|
||||
OPTIMIZE TABLE v1;
|
||||
Table Op Msg_type Msg_text
|
||||
test.v1 optimize Error 'test.v1' is not BASE TABLE
|
||||
test.v1 optimize error Corrupt
|
||||
test.v1 optimize status Operation failed
|
||||
ANALYZE TABLE v1;
|
||||
Table Op Msg_type Msg_text
|
||||
test.v1 analyze Error 'test.v1' is not BASE TABLE
|
||||
test.v1 analyze error Corrupt
|
||||
test.v1 analyze status Operation failed
|
||||
REPAIR TABLE v1;
|
||||
Table Op Msg_type Msg_text
|
||||
test.v1 repair Error 'test.v1' is not BASE TABLE
|
||||
test.v1 repair error Corrupt
|
||||
test.v1 repair status Operation failed
|
||||
DROP VIEW v1;
|
||||
create definer = current_user() sql security invoker view v1 as select 1;
|
||||
show create view v1;
|
||||
@ -5510,6 +5510,14 @@ execute stmt;
|
||||
deallocate prepare stmt;
|
||||
drop view v1,v2;
|
||||
drop table `t1`;
|
||||
create table t1 (a int, b int);
|
||||
create view v1 as select a+b from t1;
|
||||
alter table v1 check partition p1;
|
||||
Table Op Msg_type Msg_text
|
||||
test.v1 check Error 'test.v1' is not BASE TABLE
|
||||
test.v1 check status Operation failed
|
||||
drop view v1;
|
||||
drop table t1;
|
||||
# -----------------------------------------------------------------
|
||||
# -- End of 5.5 tests.
|
||||
# -----------------------------------------------------------------
|
||||
|
20
mysql-test/std_data/ca-cert-verify.pem
Normal file
20
mysql-test/std_data/ca-cert-verify.pem
Normal file
@ -0,0 +1,20 @@
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIDWzCCAkOgAwIBAgIJAO/QdKLEDQdXMA0GCSqGSIb3DQEBCwUAMEQxCzAJBgNV
|
||||
BAYTAklOMREwDwYDVQQIDAhLYXJuYXRrYTESMBAGA1UEBwwJQmFuZ2Fsb3JlMQ4w
|
||||
DAYDVQQKDAVNeVNRTDAeFw0xNjAxMDUxMDA1MDhaFw0yNTExMTMxMDA1MDhaMEQx
|
||||
CzAJBgNVBAYTAklOMREwDwYDVQQIDAhLYXJuYXRrYTESMBAGA1UEBwwJQmFuZ2Fs
|
||||
b3JlMQ4wDAYDVQQKDAVNeVNRTDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
|
||||
ggEBAKdOCuS2CzfBTJ2x8SAzY0J7cYJfNJvMDF1cvANnhkIhtnkWt/HZ5DJ9NxeX
|
||||
q5h7FJLAi4gddqdk/tvQJw0V6gZepJr/mKVnMPivF5+oHPc9ZJQMX6B3FBNwWylm
|
||||
ACd5GKx8I/H/MXyuhQTcoV//Ab+2pI8RHeYbBsm3lHH+tX7bRU6mUFjneqMpiCkb
|
||||
JHt6BWZiWR10O6pMuGQ9+dDdsLhEV1fj3CctEPwW6rs4IZzD8xl5n+8cy7qu6eYH
|
||||
Wt/snwsTzkrufeMRqTtqelxON9eoQwYOR1oH3vNEVlcbuoJAvaWOqBROUBdf12SP
|
||||
TYSdP9nlRh7lTKQOywN4kYt6LqUCAwEAAaNQME4wHQYDVR0OBBYEFJ4c9tKaUU0P
|
||||
EjBq5G207jjXI7RAMB8GA1UdIwQYMBaAFJ4c9tKaUU0PEjBq5G207jjXI7RAMAwG
|
||||
A1UdEwQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBABRnUyj21oFi0SGJg/K5+8Lc
|
||||
4n6OwVU/NgLOysIB0baIP/Rqeaze59xG/v9FPQgBlWcJK3RabOywx5bxAxdcus+1
|
||||
yp5j4h37Qq1/qkgqmevvdSAPa0OBQbLb+58/naV+ywUpCYZ6flLdCMH3fXuDSlSq
|
||||
qrCznextjojtWbnzrBmCmJmXWGd2gSaJDvb90ZZp/Elt3vN1sgjW0M/JEkb4MJ1r
|
||||
6nfD/FHr2lUwBHm2yk7Blovx7x4d/Ip3pglk63cNO/Rn0SBTdoVDS2LB9du3Phq2
|
||||
TZiL3NrRMGUNwmdaavyrJxaPq5D+Sfa4LYP3MMYD4KhLogNzIl299n5joyizlJw=
|
||||
-----END CERTIFICATE-----
|
19
mysql-test/std_data/server-cert-verify-fail.pem
Normal file
19
mysql-test/std_data/server-cert-verify-fail.pem
Normal file
@ -0,0 +1,19 @@
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIDJzCCAg8CAQEwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UEBhMCSU4xETAPBgNV
|
||||
BAgMCEthcm5hdGthMRIwEAYDVQQHDAlCYW5nYWxvcmUxDjAMBgNVBAoMBU15U1FM
|
||||
MB4XDTE2MDEwNTEwMDgyN1oXDTI1MTExMzEwMDgyN1owbzELMAkGA1UEBhMCSU4x
|
||||
EjAQBgNVBAgMCTpLYXJuYXRrYTETMBEGA1UEBwwKOkJhbmdhbG9yZTEPMA0GA1UE
|
||||
CgwGOk15U1FMMRcwFQYDVQQLDA4vQ049bG9jYWxob3N0LzENMAsGA1UEAwwEZmFp
|
||||
bDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL3wnWuJodzZYq9TAJRm
|
||||
HU7995FA3TEWdUinYTgGP79aTVQ4M9aeINlB6whWXOI8seh9Ja7C6kMzqOgYbgCl
|
||||
WlDPAVJWktFYeWXOLxbpzh1KWkS6jBkWT02t7H7JcYbil7xjlJUxLz4UOOUDUDIP
|
||||
6yqdA9VE3osESttjzj57Zm2xPqzbIHVJfORn7EexH4pryS7439p6i4XtfL31NJ8V
|
||||
07M3j3a8GqbcEqXYvcUCrLnywDQ1igP817b6ta52nbgYWiqdn0mJs535UJ/p/rSl
|
||||
D4Ae/6G3BSEY7whir6xY6vsd4KJ6w+wRCHnY0ky6OdDJVJLH1iqh7si7P3RBGkxw
|
||||
Y7MCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAggbw1jj2b7H5KDdeGJGIoOGkQAcs
|
||||
GNSJussCfdk7qnzYXKmjyNppC86jjaOrXona5f+SNCuujdu86Tv8V69EH57k4lUc
|
||||
DW7J4AD3vUb/tBzB0tsI/76Z4gm1XoCsnCGGpWd8GQAg/QNn/ZfJB2Vb/9ObN6rH
|
||||
0HV7ouB6OGZSsb71+grKiN6mDyB1lZynCGvqBxOCKFISfcRbCNFHo/pONlHaNGPE
|
||||
vjDH1bPZbEHj8owYgkdcQe0a8EbJYeQfm6fH8V8bmUcG7N60DrCnq4l1qwwVkh1S
|
||||
7RpIDgrWkU+esIIdYZIIbtDxQP1Sm7kUh++7b+bcHnyw3KtDVSCw7MIedA==
|
||||
-----END CERTIFICATE-----
|
19
mysql-test/std_data/server-cert-verify-pass.pem
Normal file
19
mysql-test/std_data/server-cert-verify-pass.pem
Normal file
@ -0,0 +1,19 @@
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIDEzCCAfsCAQEwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UEBhMCSU4xETAPBgNV
|
||||
BAgMCEthcm5hdGthMRIwEAYDVQQHDAlCYW5nYWxvcmUxDjAMBgNVBAoMBU15U1FM
|
||||
MB4XDTE2MDEwNTEwMDU1OVoXDTI1MTExMzEwMDU1OVowWzELMAkGA1UEBhMCSU4x
|
||||
EjAQBgNVBAgMCTpLYXJuYXRrYTETMBEGA1UEBwwKOkJhbmdhbG9yZTEPMA0GA1UE
|
||||
CgwGOk15U1FMMRIwEAYDVQQDDAlsb2NhbGhvc3QwggEiMA0GCSqGSIb3DQEBAQUA
|
||||
A4IBDwAwggEKAoIBAQDAmkbUwDe+nrqL8A8uwlIZk74HHCDjUAWrskKF9leEIQsB
|
||||
5exFZ8JEo1u6mdR4laQWsxizGdTPqIEidkDyyEMh4+joHgyQEPD/G3rFVW8yEFHb
|
||||
42O04O96BEPFXNPDRuX3MxI+lGbYDjxTS/WhVub4/3SqLjC28FJmEUXIHA0/A+c5
|
||||
hlYXK0u+aPAqXxHIjBgB4BxxHXZKqecmvR3LhXoVmhJmndsVfKajB27nDKc8/OTI
|
||||
H2SXb6h3nRPDXRfwB/C5i+004tEsVeIgkYshcCgLSyDdeVieUP2pm3EAmDSjmtLF
|
||||
6CgY/EBSfH+JCKFUk75bA4k8CCGzBfIeOcsKHwgFAgMBAAEwDQYJKoZIhvcNAQEL
|
||||
BQADggEBAInDuHtDkeT6dkWmRJCP56c4xiQqib2QuYUuMSrAhf07xlLHc6iHnD2X
|
||||
hCWCrja6uwF90DnPjeouKMAUe5txq/uKA8/Y/NfXN6nPiAeHLI0qnTv7Mr9TQ8zU
|
||||
DNDwRz6onlI2cS4GhrwAnlpiaxu7AjMUWHtfBFGFrgn3PawjDQpsBZNcxw1QsLc0
|
||||
E0hFrWLOd0vDETEhoRge88N7a0jqK0Rd9cvRWnvjI+IsjQMLZzKufivIHPzI9K+9
|
||||
Wtp8iRHcaBr5DpsBjgsO7dqVRbsNyaWsdHdLt+CQSGXpv7P6fq3K6nJFTBeIgSfS
|
||||
gflrHVKYZRkKDDDpX4yHNdnIqrvy4RU=
|
||||
-----END CERTIFICATE-----
|
27
mysql-test/std_data/server-key-verify-fail.pem
Normal file
27
mysql-test/std_data/server-key-verify-fail.pem
Normal file
@ -0,0 +1,27 @@
|
||||
-----BEGIN RSA PRIVATE KEY-----
|
||||
MIIEpQIBAAKCAQEAvfCda4mh3Nlir1MAlGYdTv33kUDdMRZ1SKdhOAY/v1pNVDgz
|
||||
1p4g2UHrCFZc4jyx6H0lrsLqQzOo6BhuAKVaUM8BUlaS0Vh5Zc4vFunOHUpaRLqM
|
||||
GRZPTa3sfslxhuKXvGOUlTEvPhQ45QNQMg/rKp0D1UTeiwRK22POPntmbbE+rNsg
|
||||
dUl85GfsR7EfimvJLvjf2nqLhe18vfU0nxXTszePdrwaptwSpdi9xQKsufLANDWK
|
||||
A/zXtvq1rnaduBhaKp2fSYmznflQn+n+tKUPgB7/obcFIRjvCGKvrFjq+x3gonrD
|
||||
7BEIedjSTLo50MlUksfWKqHuyLs/dEEaTHBjswIDAQABAoIBAQCSUyNzDPydXvsf
|
||||
hhoUOParPAvU4tuETYDdD9Vdi7Lgf3jDQOjulbNIq/ec3KuBvrBwIrk9APvn+YxO
|
||||
AUP9S2Vgi5jBDeDdVgNv4n90b3pSJk2UVQJI8V72wN5Ibnf/KeErSKvWo6V5daq/
|
||||
AuZtKsZIdd3WFtA62HuyuBjTGc23Alj1C0EKnN0Rx1uBwDvx/OVQ266Us/x8jJqW
|
||||
ZxIOfcvfNzBQEa5hAzbQCReVaC+rBLRAcMM2yGP7aDa+8cRkwuVlSqpX8CXBdLoU
|
||||
PqmU49etcW72Rb1AFt9WgEu1Oh9UYbHFSB+FEbO8IGcGBsuYHf9zkxQyjpy/iKyT
|
||||
H5dTu7YBAoGBAOWqEGepZVrfB+P6X18n3vbJhgYmF0sa0mCmwkFYgk36yNqsZ8at
|
||||
lQjm5mbn4wjEKHIcQ/T1taq73W471M+PxMnn0WTwoG5jsyarZGgy6/95YXiyZtQe
|
||||
qgA4P3aKkCteRP22DjG7uxmm9Hoqx8Z31vfRTLAHN1IEHPHHkg/J3gPTAoGBANO4
|
||||
aqKeY4vcDvVkvxVbADrw++tZGwA+RuxfO4HKKru59VdA2PsAxhXwb3Dfejwj7hYW
|
||||
yE9edHjGpMr1+dpf8YJYs7qjajHe1HxBOYqQGHycIdw+Gv56R4HpaS9eW3x8l/Pi
|
||||
b4xnAodv2qIriACOe7br+rll4wKX46Wt64zdvpShAoGAT0r3HQM0Vjp4u/J+qRjX
|
||||
9za+yjKuiiS5i9snaG5JlujGHhG2Rrc5pHgsBk17alRnbnZp1BJdZZQ1MFEB+aO2
|
||||
mssp1YLqsRJFEU3NfdhO+MaMq6JUtFnd8fN5ndDbU83ZXgtUPUGGqKWm9OL+VHyd
|
||||
wLQHmSL0q6F16Ngxirf0qjcCgYEAtSmiJVA+gdhk/FmeoBlkEwtNpM50Kjsf2PaM
|
||||
Jrzk4Al5A5Y7lFvPI8q+sOio4XklKsWH1VJPe2EOdZUQnGlocE6SS+u03MN9Mm1l
|
||||
XUl7inTXDGwgEQx0z5b4KE4nHlhGdauWI5+pLFbrz8RL9Z32AkneGnIyU2/AnW46
|
||||
lijQAMECgYEAmgp/88ndIw49RCtMhYhtXQ87AsEAP6kzXQyKppDkn0os+xI5igIL
|
||||
i/UDxB33hx3yjrUZwoGDV9MwlMhZNX5Tf5bwjPmmh1NR6KdEpPt5AkklX4s6uil2
|
||||
Bxl1P5l1jl/PbEYtv5LDZKIPANWRzViMSIWqjUWlbdqE7/vjx+Oo+cc=
|
||||
-----END RSA PRIVATE KEY-----
|
27
mysql-test/std_data/server-key-verify-pass.pem
Normal file
27
mysql-test/std_data/server-key-verify-pass.pem
Normal file
@ -0,0 +1,27 @@
|
||||
-----BEGIN RSA PRIVATE KEY-----
|
||||
MIIEowIBAAKCAQEAwJpG1MA3vp66i/APLsJSGZO+Bxwg41AFq7JChfZXhCELAeXs
|
||||
RWfCRKNbupnUeJWkFrMYsxnUz6iBInZA8shDIePo6B4MkBDw/xt6xVVvMhBR2+Nj
|
||||
tODvegRDxVzTw0bl9zMSPpRm2A48U0v1oVbm+P90qi4wtvBSZhFFyBwNPwPnOYZW
|
||||
FytLvmjwKl8RyIwYAeAccR12SqnnJr0dy4V6FZoSZp3bFXymowdu5wynPPzkyB9k
|
||||
l2+od50Tw10X8AfwuYvtNOLRLFXiIJGLIXAoC0sg3XlYnlD9qZtxAJg0o5rSxego
|
||||
GPxAUnx/iQihVJO+WwOJPAghswXyHjnLCh8IBQIDAQABAoIBAHPQUSc9LkgBSks7
|
||||
XuXPE28t1+aOk3gcdkx4NGg5aQaal/PcPea+LaL4WAAs4AZidPjxWLjZn43+1SfT
|
||||
09opcbS/Rx3Mc+FtTn0YGQrwBJ0mExMV+K6bU2Ubi2TyHKQfzciHfUEEG5Nve/ba
|
||||
hikuCFVRxuVOQRzABcw6NqvNsmlg892lfw6/+RDwMBcz7ocwzmiOUoIxgjyFo9G4
|
||||
aJvRmHLij5892H6qveik+A/Xr+8leGQHiQET2wW/F9MFP5ypIT7aeE6remeZH7fG
|
||||
f4/Zfei/TE4xK2ElNR/91byzeKIVY4vjtTndAiBuqpfYuICb40MC02LNW5Oe6VN2
|
||||
3mQ6EgECgYEA7O4ndBnbs/00gyTGyNg6I+3wRTibhNH4R8RZFJiLfKRKOlUiLhUo
|
||||
+bQeO4bCQ6YY++TYDvMEXTlA3jow9R9Mj2AWc6bNmQmJd/065QyFHftywT66I+V4
|
||||
rz1ohSJyHXcv4DxqNk3o3Vb4N8GFjZKcodSgTv2Lk+9ipDYFcQiZop0CgYEA0BrF
|
||||
SIyLTnjoVht/7RbIGEqhMQUiz5mx7qQ1TPB+YTG77G2xXJNg5d6S7WT4LN+cqbxN
|
||||
YdndIbW4NdV7bH7FlG9q7jfkuZ+AY2BPU047tcDeyO0HYYEhVY+EyZqHci/26mvt
|
||||
JrawdqS5HQS1y/rKfytm7YBGTvqoNZHvOHc6aokCgYEAxcjlbJkte+pyzMuFmiJP
|
||||
HrFBczeXM+BoJ9j0GCpjvvAS+vEYsGl/pDvFRSHwx7I/hv/5kTkzOnNSAHGJbwbq
|
||||
zYGEHJVxakC43k6pvI2gDnBa0pD/qHmmLnvP5dvkcU6Oy90DOUP+kc9JNJo7V/y8
|
||||
/qdWD7q+qwcaTETAdCSexE0CgYA/DN1Y7bwHOnqqHArWOmDFe1b7EyNI4rgWJYpA
|
||||
lVy09eyJ5XInKj/hZV3+rujCL723b2XCj89/tx7osJWEeaRDJL6xDh4uXzT25uch
|
||||
xkIw/w6Asc/aqtT+p00EB92hqwaUX76qTA+K4r1zHUo3UvSnMu8sZgDnTOpJ0L05
|
||||
zmXUgQKBgDT+IFrAzOty4B0mJncTCC/TulpW704bEZwNJfQSdtiBQr/vqoXygBQc
|
||||
bHfpncpSfhzHB5lhRUv02TqXgl53D70nM7JD5nx98WYTTBxsbvxPlt4gBRZkfgq5
|
||||
tHKclAArc1SbfW5Z8oYyl7h33LQJK116QSyiIIGieH5VXNPwnqUs
|
||||
-----END RSA PRIVATE KEY-----
|
@ -48,7 +48,7 @@ sub skip_combinations {
|
||||
return 0 unless socket my $sock, PF_INET6, SOCK_STREAM, getprotobyname('tcp');
|
||||
# eval{}, if there's no Socket::sockaddr_in6 at all, old Perl installation
|
||||
eval { connect $sock, sockaddr_in6(7, Socket::IN6ADDR_LOOPBACK) };
|
||||
return $! != 101;
|
||||
return $@ eq "";
|
||||
}
|
||||
$skip{'include/check_ipv6.inc'} = 'No IPv6' unless ipv6_ok();
|
||||
|
||||
|
@ -52,7 +52,7 @@ insert into marker set a = 1;
|
||||
optimize table test.v1;
|
||||
Table Op Msg_type Msg_text
|
||||
test.v1 optimize Error 'test.v1' is not BASE TABLE
|
||||
test.v1 optimize error Corrupt
|
||||
test.v1 optimize status Operation failed
|
||||
insert into marker set a = 1;
|
||||
select * from test.v1;
|
||||
a b
|
||||
|
@ -8,6 +8,7 @@ select * from information_schema.feedback where variable_name like 'feed%'
|
||||
VARIABLE_NAME VARIABLE_VALUE
|
||||
FEEDBACK used 1
|
||||
FEEDBACK version 1.1
|
||||
FEEDBACK_HTTP_PROXY
|
||||
FEEDBACK_SEND_RETRY_WAIT 60
|
||||
FEEDBACK_SEND_TIMEOUT 60
|
||||
FEEDBACK_URL http://mariadb.org/feedback_plugin/post
|
||||
|
@ -10,6 +10,7 @@ select * from information_schema.feedback where variable_name like 'feed%'
|
||||
and variable_name not like '%debug%';
|
||||
VARIABLE_NAME VARIABLE_VALUE
|
||||
FEEDBACK version 1.1
|
||||
FEEDBACK_HTTP_PROXY
|
||||
FEEDBACK_SEND_RETRY_WAIT 60
|
||||
FEEDBACK_SEND_TIMEOUT 60
|
||||
FEEDBACK_URL http://mariadb.org/feedback_plugin/post
|
||||
|
@ -10,6 +10,7 @@ select * from information_schema.feedback where variable_name like 'feed%'
|
||||
and variable_name not like '%debug%';
|
||||
VARIABLE_NAME VARIABLE_VALUE
|
||||
FEEDBACK version 1.1
|
||||
FEEDBACK_HTTP_PROXY
|
||||
FEEDBACK_SEND_RETRY_WAIT 60
|
||||
FEEDBACK_SEND_TIMEOUT 60
|
||||
FEEDBACK_URL http://mariadb.org/feedback_plugin/post
|
||||
|
@ -0,0 +1,29 @@
|
||||
include/master-slave.inc
|
||||
[connection master]
|
||||
Test case 1:- table name with one character latin name.
|
||||
SET @s:=CONCAT("CREATE TABLE `",REPEAT(CHAR(131),1),"` (a INT)");
|
||||
PREPARE STMT FROM @s;
|
||||
EXECUTE stmt;
|
||||
SET @s:=CONCAT("INSERT INTO `",REPEAT(CHAR(131),1),"` VALUES (1)");
|
||||
PREPARE STMT FROM @s;
|
||||
EXECUTE stmt;
|
||||
SET @s:=CONCAT("DROP TABLE `",REPEAT(CHAR(131),1), "`");
|
||||
PREPARE STMT FROM @s;
|
||||
EXECUTE stmt;
|
||||
Test case 2:- table name and database names with one character latin name.
|
||||
SET @s:=CONCAT("CREATE DATABASE `",REPEAT(CHAR(131),1),"`");
|
||||
PREPARE STMT FROM @s;
|
||||
EXECUTE stmt;
|
||||
SET @s:=CONCAT("CREATE TABLE `",REPEAT(CHAR(131),1),"`.`",REPEAT(CHAR(131),1),"` (a INT)");
|
||||
PREPARE STMT FROM @s;
|
||||
EXECUTE stmt;
|
||||
SET @s:=CONCAT("INSERT INTO `",REPEAT(CHAR(131),1),"`.`",REPEAT(CHAR(131),1),"` VALUES (1)");
|
||||
PREPARE STMT FROM @s;
|
||||
EXECUTE stmt;
|
||||
SET @s:=CONCAT("DROP TABLE `",REPEAT(CHAR(131),1),"`.`",REPEAT(CHAR(131),1), "`");
|
||||
PREPARE STMT FROM @s;
|
||||
EXECUTE stmt;
|
||||
SET @s:=CONCAT("DROP DATABASE `",REPEAT(CHAR(131),1),"`");
|
||||
PREPARE STMT FROM @s;
|
||||
EXECUTE stmt;
|
||||
include/rpl_end.inc
|
53
mysql-test/suite/rpl/r/rpl_unsafe_statements.result
Normal file
53
mysql-test/suite/rpl/r/rpl_unsafe_statements.result
Normal file
@ -0,0 +1,53 @@
|
||||
include/master-slave.inc
|
||||
[connection master]
|
||||
CREATE TABLE t1(id INT AUTO_INCREMENT, i INT, PRIMARY KEY (id)) ENGINE=INNODB;
|
||||
CREATE TABLE t2(id INT AUTO_INCREMENT, i INT, PRIMARY KEY (id)) ENGINE=INNODB;
|
||||
CREATE TRIGGER trig1 AFTER INSERT ON t1
|
||||
FOR EACH ROW
|
||||
INSERT INTO t2(i) VALUES(new.i);
|
||||
START TRANSACTION;
|
||||
INSERT INTO t2(i) VALUES (1);
|
||||
ROLLBACK;
|
||||
INSERT INTO t1(i) VALUES(2);
|
||||
START TRANSACTION;
|
||||
LOCK TABLES t1 WRITE, t2 WRITE;
|
||||
INSERT INTO t1(i) VALUES(3);
|
||||
UNLOCK TABLES;
|
||||
COMMIT;
|
||||
include/diff_tables.inc [master:t1, slave:t1]
|
||||
include/diff_tables.inc [master:t2, slave:t2]
|
||||
DROP TABLE t1,t2;
|
||||
CREATE TABLE t1(i INT) ENGINE=INNODB;
|
||||
CREATE TABLE t2(id INT AUTO_INCREMENT, i INT, PRIMARY KEY (id)) ENGINE=INNODB;
|
||||
INSERT INTO t1 values (1), (2), (3);
|
||||
START TRANSACTION;
|
||||
INSERT INTO t2(i) VALUES (1);
|
||||
ROLLBACK;
|
||||
INSERT INTO t2(i) SELECT i FROM t1;
|
||||
START TRANSACTION;
|
||||
LOCK TABLES t2 WRITE, t1 READ;
|
||||
INSERT INTO t2(i) SELECT i FROM t1;
|
||||
UNLOCK TABLES;
|
||||
COMMIT;
|
||||
include/diff_tables.inc [master:t1, slave:t1]
|
||||
include/diff_tables.inc [master:t2, slave:t2]
|
||||
DROP TABLE t1,t2;
|
||||
CREATE TABLE t1(i int, id INT AUTO_INCREMENT, PRIMARY KEY (i, id)) ENGINE=MYISAM;
|
||||
INSERT INTO t1 (i) values (1);
|
||||
START TRANSACTION;
|
||||
LOCK TABLES t1 WRITE;
|
||||
INSERT INTO t1 (i) values (2);
|
||||
UNLOCK TABLES;
|
||||
COMMIT;
|
||||
include/diff_tables.inc [master:t1, slave:t1]
|
||||
DROP TABLE t1;
|
||||
CREATE TABLE t1(i INT, j INT, UNIQUE KEY(i), UNIQUE KEY(j)) ENGINE=INNODB;
|
||||
INSERT INTO t1 (i,j) VALUES (1,2) ON DUPLICATE KEY UPDATE j=j+1;
|
||||
START TRANSACTION;
|
||||
LOCK TABLES t1 WRITE;
|
||||
INSERT INTO t1 (i,j) VALUES (1,2) ON DUPLICATE KEY UPDATE j=j+1;
|
||||
UNLOCK TABLES;
|
||||
COMMIT;
|
||||
include/diff_tables.inc [master:t1, slave:t1]
|
||||
DROP TABLE t1;
|
||||
include/rpl_end.inc
|
@ -0,0 +1,87 @@
|
||||
###############################################################################
|
||||
# Bug#21205695 DROP TABLE MAY CAUSE SLAVES TO BREAK
|
||||
#
|
||||
# Problem:
|
||||
# ========
|
||||
# 1) Drop table queries are re-generated by server
|
||||
# before writing the events(queries) into binlog
|
||||
# for various reasons. If table name/db name contains
|
||||
# a non regular characters (like latin characters),
|
||||
# the generated query is wrong. Hence it breaks the
|
||||
# replication.
|
||||
# 2) In the edge case, when table name contains
|
||||
# 64 latin characters (latin takes 2 bytes), server is
|
||||
# throwing an assert (M_TBLLEN < 128)
|
||||
#
|
||||
# 3) In the edge case, when db name contains 64 latin
|
||||
# characters, binlog contents are interpreted wrongly
|
||||
# which is leading to replication issues.
|
||||
#
|
||||
###############################################################################
|
||||
|
||||
--source include/not_windows.inc
|
||||
--source include/master-slave.inc
|
||||
|
||||
--let iter=1
|
||||
# Change iteration to 4 after fixing Bug #22280214
|
||||
while ($iter <= 2)
|
||||
{
|
||||
--connection master
|
||||
if ($iter == 1)
|
||||
{
|
||||
--echo Test case 1:- table name with one character latin name.
|
||||
--let $tblname= REPEAT(CHAR(131),1)
|
||||
}
|
||||
if ($iter == 2)
|
||||
{
|
||||
--echo Test case 2:- table name and database names with one character latin name.
|
||||
--let $tblname= REPEAT(CHAR(131),1),"`.`",REPEAT(CHAR(131),1)
|
||||
--eval SET @s:=CONCAT("CREATE DATABASE `",REPEAT(CHAR(131),1),"`")
|
||||
PREPARE STMT FROM @s; EXECUTE stmt;
|
||||
}
|
||||
# After fixing Bug #22280214 DATADIR LOCATION IS LIMITING
|
||||
# IDENTIFIER MAX LENGTH, the following two tests (iter 3 and 4) can be
|
||||
# uncommented.
|
||||
#if ($iter == 3)
|
||||
#{
|
||||
# --echo Test case 3:- table name and database names with 64 latin characters name.
|
||||
# --let $tblname= REPEAT(CHAR(131),64),"`.`", REPEAT(CHAR(131),64)
|
||||
# --eval SET @s:=CONCAT("CREATE DATABASE `",REPEAT(CHAR(131),64),"`")
|
||||
# PREPARE STMT FROM @s; EXECUTE stmt;
|
||||
#}
|
||||
#if ($iter == 4)
|
||||
#{
|
||||
# --echo Test case 4:- table name and database names with 64 Euro(€) characters.
|
||||
# --let $tblname= REPEAT(CHAR(226,130,172),64),"`.`", REPEAT(CHAR(226,130,172),64)
|
||||
# --eval SET @s:=CONCAT("CREATE DATABASE `",REPEAT(CHAR(226,130,172),64),"`")
|
||||
# PREPARE STMT FROM @s; EXECUTE stmt;
|
||||
#}
|
||||
--eval SET @s:=CONCAT("CREATE TABLE `",$tblname,"` (a INT)")
|
||||
PREPARE STMT FROM @s; EXECUTE stmt;
|
||||
--eval SET @s:=CONCAT("INSERT INTO `",$tblname,"` VALUES (1)")
|
||||
PREPARE STMT FROM @s; EXECUTE stmt;
|
||||
--eval SET @s:=CONCAT("DROP TABLE `",$tblname, "`")
|
||||
PREPARE STMT FROM @s; EXECUTE stmt;
|
||||
if ($iter == 2)
|
||||
{
|
||||
--eval SET @s:=CONCAT("DROP DATABASE `",REPEAT(CHAR(131),1),"`")
|
||||
PREPARE STMT FROM @s; EXECUTE stmt;
|
||||
}
|
||||
# After fixing Bug #22280214 DATADIR LOCATION IS LIMITING
|
||||
# IDENTIFIER MAX LENGTH, the following two tests (iter 3 and 4) can be
|
||||
# uncommented.
|
||||
#if ($iter == 3)
|
||||
#{
|
||||
# --eval SET @s:=CONCAT("DROP DATABASE `",REPEAT(CHAR(131),64),"`")
|
||||
# PREPARE STMT FROM @s; EXECUTE stmt;
|
||||
#}
|
||||
#if ($iter == 4)
|
||||
#{
|
||||
# --eval SET @s:=CONCAT("DROP DATABASE `",REPEAT(CHAR(226,130,172),64),"`")
|
||||
# PREPARE STMT FROM @s; EXECUTE stmt;
|
||||
#}
|
||||
--sync_slave_with_master
|
||||
--inc $iter
|
||||
}
|
||||
|
||||
--source include/rpl_end.inc
|
176
mysql-test/suite/rpl/t/rpl_unsafe_statements.test
Normal file
176
mysql-test/suite/rpl/t/rpl_unsafe_statements.test
Normal file
@ -0,0 +1,176 @@
|
||||
################################################################################
|
||||
# Bug#17047208 REPLICATION DIFFERENCE FOR MULTIPLE TRIGGERS
|
||||
# Problem: If DML invokes a trigger or a stored function that inserts into an
|
||||
# AUTO_INCREMENT column, that DML has to be marked as 'unsafe' statement. If the
|
||||
# tables are locked in the transaction prior to DML statement (using LOCK
|
||||
# TABLES), then the DML statement is not marked as 'unsafe' statement.
|
||||
|
||||
# Steps to reproduce the reported test case (BINLOG_STMT_UNSAFE_AUTOINC_COLUMNS)
|
||||
# Case-1:
|
||||
# > Create a trigger on a table and do a insert in the trigger that updates
|
||||
# auto increment column
|
||||
# > A DML that executes the trigger in step.1 and check that DML is marked
|
||||
# as unsafe and DML is written into binlog using row format (in MBR)
|
||||
# > Execute the step 2 by locking the required tables prior to DML and check
|
||||
# that DML is marked as unsafe and DML is written into binlog using row
|
||||
# format (in MBR)
|
||||
#
|
||||
# This test script also adds test cases to cover few other unsafe statements.
|
||||
# Case-2: BINLOG_STMT_UNSAFE_WRITE_AUTOINC_SELECT
|
||||
# Case-3: BINLOG_STMT_UNSAFE_AUTOINC_NOT_FIRST
|
||||
# Case-4: BINLOG_STMT_UNSAFE_INSERT_TWO_KEYS
|
||||
################################################################################
|
||||
|
||||
--source include/have_innodb.inc
|
||||
--source include/have_binlog_format_mixed.inc
|
||||
--source include/master-slave.inc
|
||||
|
||||
# Case-1: BINLOG_STMT_UNSAFE_AUTOINC_COLUMNS
|
||||
# Statement is unsafe because it invokes a trigger or a
|
||||
# stored function that inserts into an AUTO_INCREMENT column.
|
||||
|
||||
# Step-1.1: Create two tables, one with AUTO_INCREMENT column.
|
||||
CREATE TABLE t1(id INT AUTO_INCREMENT, i INT, PRIMARY KEY (id)) ENGINE=INNODB;
|
||||
CREATE TABLE t2(id INT AUTO_INCREMENT, i INT, PRIMARY KEY (id)) ENGINE=INNODB;
|
||||
|
||||
# Step-1.2: Create a trigger that inserts into an AUTO_INCREMENT column.
|
||||
CREATE TRIGGER trig1 AFTER INSERT ON t1
|
||||
FOR EACH ROW
|
||||
INSERT INTO t2(i) VALUES(new.i);
|
||||
|
||||
# Step-1.3: Create some gap in auto increment value on master's t2 table
|
||||
# but not on slave (by doing rollback). Just in case if the unsafe statements
|
||||
# are written in statement format, diff tables will fail.
|
||||
START TRANSACTION;
|
||||
INSERT INTO t2(i) VALUES (1);
|
||||
ROLLBACK;
|
||||
|
||||
# Step-1.4: Insert a tuple into table t1 that triggers trig1 which inserts
|
||||
# into an AUTO_INCREMENT column.
|
||||
INSERT INTO t1(i) VALUES(2);
|
||||
|
||||
# Step-1.5: Repeat step 1.4 but using 'LOCK TABLES' logic.
|
||||
START TRANSACTION;
|
||||
LOCK TABLES t1 WRITE, t2 WRITE;
|
||||
INSERT INTO t1(i) VALUES(3);
|
||||
UNLOCK TABLES;
|
||||
COMMIT;
|
||||
|
||||
# Step-1.6: Sync slave with master
|
||||
--sync_slave_with_master
|
||||
|
||||
# Step-1.7: Diff master-slave tables to make sure everything is in sync.
|
||||
--let $diff_tables=master:t1, slave:t1
|
||||
--source include/diff_tables.inc
|
||||
|
||||
--let $diff_tables=master:t2, slave:t2
|
||||
--source include/diff_tables.inc
|
||||
|
||||
# Step-1.8: Cleanup
|
||||
--connection master
|
||||
DROP TABLE t1,t2;
|
||||
|
||||
# Case-2: BINLOG_STMT_UNSAFE_WRITE_AUTOINC_SELECT
|
||||
# Statements writing to a table with an auto-increment column after selecting
|
||||
# from another table are unsafe because the order in which rows are retrieved
|
||||
# determines what (if any) rows will be written. This order cannot be
|
||||
# predicted and may differ on master and the slave.
|
||||
|
||||
# Step-2.1: Create two tables, one with AUTO_INCREMENT column.
|
||||
CREATE TABLE t1(i INT) ENGINE=INNODB;
|
||||
CREATE TABLE t2(id INT AUTO_INCREMENT, i INT, PRIMARY KEY (id)) ENGINE=INNODB;
|
||||
|
||||
# Step-2.2: Create some tuples in table t1.
|
||||
INSERT INTO t1 values (1), (2), (3);
|
||||
|
||||
# Step-2.3: Create some gap in auto increment value on master's t2 table
|
||||
# but not on slave (by doing rollback). Just in case if the unsafe statements
|
||||
# are written in statement format, diff tables will fail.
|
||||
START TRANSACTION;
|
||||
INSERT INTO t2(i) VALUES (1);
|
||||
ROLLBACK;
|
||||
|
||||
# Step-2.4: Insert into t2 (table with an auto-increment) by selecting tuples
|
||||
# from table t1.
|
||||
INSERT INTO t2(i) SELECT i FROM t1;
|
||||
|
||||
# Step-2.5: Repeat step 2.4 but now with 'LOCK TABLES' logic.
|
||||
START TRANSACTION;
|
||||
LOCK TABLES t2 WRITE, t1 READ;
|
||||
INSERT INTO t2(i) SELECT i FROM t1;
|
||||
UNLOCK TABLES;
|
||||
COMMIT;
|
||||
|
||||
# Step-2.6: Sync slave with master
|
||||
--sync_slave_with_master
|
||||
|
||||
# Step-2.7: Diff master-slave tables to make sure everything is in sync.
|
||||
--let $diff_tables=master:t1, slave:t1
|
||||
--source include/diff_tables.inc
|
||||
|
||||
--let $diff_tables=master:t2, slave:t2
|
||||
--source include/diff_tables.inc
|
||||
|
||||
# Step-2.8: Cleanup
|
||||
--connection master
|
||||
DROP TABLE t1,t2;
|
||||
|
||||
# Case-3: BINLOG_STMT_UNSAFE_AUTOINC_NOT_FIRST
|
||||
# INSERT into autoincrement field which is not the first part in the
|
||||
# composed primary key is unsafe
|
||||
#
|
||||
# Step-3.1: Create a table with auto increment column and a composed primary key
|
||||
# (second column is auto increment column). Such a definition is allowed only
|
||||
# with 'myisam' engine.
|
||||
CREATE TABLE t1(i int, id INT AUTO_INCREMENT, PRIMARY KEY (i, id)) ENGINE=MYISAM;
|
||||
|
||||
# Step-3.2: Inserting into such a table is unsafe.
|
||||
INSERT INTO t1 (i) values (1);
|
||||
|
||||
# Step-3.3: Repeat step 3.2, now with 'LOCK TABLES' logic.
|
||||
START TRANSACTION;
|
||||
LOCK TABLES t1 WRITE;
|
||||
INSERT INTO t1 (i) values (2);
|
||||
UNLOCK TABLES;
|
||||
COMMIT;
|
||||
|
||||
# Step-3.4: Sync slave with master
|
||||
--sync_slave_with_master
|
||||
|
||||
# Step-3.5: Diff master-slave tables to make sure everything is in sync.
|
||||
--let $diff_tables=master:t1, slave:t1
|
||||
--source include/diff_tables.inc
|
||||
|
||||
# Step-3.6: Cleanup
|
||||
--connection master
|
||||
DROP TABLE t1;
|
||||
|
||||
# Case-4: BINLOG_STMT_UNSAFE_INSERT_TWO_KEYS
|
||||
# INSERT... ON DUPLICATE KEY UPDATE on a table with more than one UNIQUE KEY
|
||||
# is unsafe Statement
|
||||
|
||||
# Step-4.1: Create a table with two unique keys
|
||||
CREATE TABLE t1(i INT, j INT, UNIQUE KEY(i), UNIQUE KEY(j)) ENGINE=INNODB;
|
||||
|
||||
# Step-4.2: Inserting into such a table is unsafe.
|
||||
INSERT INTO t1 (i,j) VALUES (1,2) ON DUPLICATE KEY UPDATE j=j+1;
|
||||
|
||||
# Step-4.3: Repeat step 3.2, now with 'LOCK TABLES' logic.
|
||||
START TRANSACTION;
|
||||
LOCK TABLES t1 WRITE;
|
||||
INSERT INTO t1 (i,j) VALUES (1,2) ON DUPLICATE KEY UPDATE j=j+1;
|
||||
UNLOCK TABLES;
|
||||
COMMIT;
|
||||
|
||||
# Step-4.4: Sync slave with master
|
||||
--sync_slave_with_master
|
||||
|
||||
# Step-4.5: Diff master-slave tables to make sure everything is in sync.
|
||||
--let $diff_tables=master:t1, slave:t1
|
||||
--source include/diff_tables.inc
|
||||
|
||||
# Step-4.6: Cleanup
|
||||
--connection master
|
||||
DROP TABLE t1;
|
||||
|
||||
--source include/rpl_end.inc
|
@ -287,3 +287,30 @@ select * from t1;
|
||||
|
||||
set sql_warnings = 0;
|
||||
drop table t1;
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-9093: Persistent computed column is not updated when
|
||||
--echo # update query contains join
|
||||
--echo #
|
||||
|
||||
CREATE TABLE `t1` (
|
||||
`id` bigint(20) NOT NULL,
|
||||
`name` varchar(254) DEFAULT NULL,
|
||||
`name_hash` varchar(64) AS (sha1(name)) PERSISTENT,
|
||||
PRIMARY KEY (`id`)
|
||||
);
|
||||
|
||||
insert into t1(id,name) values (2050, 'name1'),(2051, 'name2'),(2041, 'name3');
|
||||
|
||||
create table t2 (id bigint);
|
||||
insert into t2 values (2050),(2051),(2041);
|
||||
|
||||
select * from t1;
|
||||
|
||||
update t1 join t2 using(id) set name = concat(name,
|
||||
'+1') where t1.id in (2051,2041);
|
||||
|
||||
select * from t1;
|
||||
|
||||
drop table t1,t2;
|
||||
|
||||
|
@ -425,3 +425,29 @@ select * from t1;
|
||||
a b c d
|
||||
set sql_warnings = 0;
|
||||
drop table t1;
|
||||
#
|
||||
# MDEV-9093: Persistent computed column is not updated when
|
||||
# update query contains join
|
||||
#
|
||||
CREATE TABLE `t1` (
|
||||
`id` bigint(20) NOT NULL,
|
||||
`name` varchar(254) DEFAULT NULL,
|
||||
`name_hash` varchar(64) AS (sha1(name)) PERSISTENT,
|
||||
PRIMARY KEY (`id`)
|
||||
);
|
||||
insert into t1(id,name) values (2050, 'name1'),(2051, 'name2'),(2041, 'name3');
|
||||
create table t2 (id bigint);
|
||||
insert into t2 values (2050),(2051),(2041);
|
||||
select * from t1;
|
||||
id name name_hash
|
||||
2041 name3 1aefcd1b0f39da45fa1fd7236f683c907c15ef82
|
||||
2050 name1 9b46b0dd3a8083c070c3b9953bb5f3f95c5ab4da
|
||||
2051 name2 39ea84acf1fef629fef18a9c6f5799bba32ecc25
|
||||
update t1 join t2 using(id) set name = concat(name,
|
||||
'+1') where t1.id in (2051,2041);
|
||||
select * from t1;
|
||||
id name name_hash
|
||||
2041 name3+1 93c9096df48221428de46e146abc9f4f94bf7d2e
|
||||
2050 name1 9b46b0dd3a8083c070c3b9953bb5f3f95c5ab4da
|
||||
2051 name2+1 fd4f236320db3956a5ec073c5ec39707d7f05708
|
||||
drop table t1,t2;
|
||||
|
@ -363,3 +363,29 @@ select * from t1;
|
||||
a b c d
|
||||
set sql_warnings = 0;
|
||||
drop table t1;
|
||||
#
|
||||
# MDEV-9093: Persistent computed column is not updated when
|
||||
# update query contains join
|
||||
#
|
||||
CREATE TABLE `t1` (
|
||||
`id` bigint(20) NOT NULL,
|
||||
`name` varchar(254) DEFAULT NULL,
|
||||
`name_hash` varchar(64) AS (sha1(name)) PERSISTENT,
|
||||
PRIMARY KEY (`id`)
|
||||
);
|
||||
insert into t1(id,name) values (2050, 'name1'),(2051, 'name2'),(2041, 'name3');
|
||||
create table t2 (id bigint);
|
||||
insert into t2 values (2050),(2051),(2041);
|
||||
select * from t1;
|
||||
id name name_hash
|
||||
2050 name1 9b46b0dd3a8083c070c3b9953bb5f3f95c5ab4da
|
||||
2051 name2 39ea84acf1fef629fef18a9c6f5799bba32ecc25
|
||||
2041 name3 1aefcd1b0f39da45fa1fd7236f683c907c15ef82
|
||||
update t1 join t2 using(id) set name = concat(name,
|
||||
'+1') where t1.id in (2051,2041);
|
||||
select * from t1;
|
||||
id name name_hash
|
||||
2050 name1 9b46b0dd3a8083c070c3b9953bb5f3f95c5ab4da
|
||||
2051 name2+1 fd4f236320db3956a5ec073c5ec39707d7f05708
|
||||
2041 name3+1 93c9096df48221428de46e146abc9f4f94bf7d2e
|
||||
drop table t1,t2;
|
||||
|
@ -2062,6 +2062,27 @@ create table t1(a enum('',''));
|
||||
drop table t1;
|
||||
set @@session.collation_server=default;
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-7765: Crash (Assertion `!table || (!table->write_set ||
|
||||
--echo # bitmap_is_set(table->write_set, field_index) ||
|
||||
--echo # bitmap_is_set(table->vcol_set, field_index))' fails)
|
||||
--echo # on using function over not created table
|
||||
--echo #
|
||||
|
||||
DELIMITER |;
|
||||
CREATE function f1() returns int
|
||||
BEGIN
|
||||
declare n int;
|
||||
set n:= (select count(*) from t1);
|
||||
return n;
|
||||
end|
|
||||
DELIMITER ;|
|
||||
-- error ER_NO_SUCH_TABLE
|
||||
create table t1 as select f1();
|
||||
drop function f1;
|
||||
|
||||
--echo End of 5.5 tests
|
||||
|
||||
#
|
||||
# MDEV-4880 Attempt to create a table without columns produces ER_ILLEGAL_HA instead of ER_TABLE_MUST_HAVE_COLUMNS
|
||||
#
|
||||
|
@ -1582,8 +1582,7 @@ SET NAMES utf8;
|
||||
SET NAMES utf8;
|
||||
CREATE TABLE t1 (a INT);
|
||||
INSERT INTO t1 VALUES (0), (0), (1), (0), (0);
|
||||
--error ER_DUP_ENTRY
|
||||
SELECT COUNT(*) FROM t1, t1 t2
|
||||
SELECT COUNT(*) FROM t1, t1 t2
|
||||
GROUP BY INSERT('', t2.a, t1.a, (@@global.max_binlog_size));
|
||||
DROP TABLE t1;
|
||||
|
||||
|
@ -538,4 +538,294 @@ select x.id, message from (select id from t1) x left join
|
||||
where coalesce(message,0) <> 0;
|
||||
drop table t1,t2;
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-7827: Assertion `!table || (!table->read_set ||
|
||||
--echo # bitmap_is_set(table->read_set, field_index))' failed
|
||||
--echo # in Field_long::val_str on EXPLAIN EXTENDED
|
||||
--echo #
|
||||
|
||||
CREATE TABLE t1 (f1 INT, f2 INT, KEY(f2)) ENGINE=MyISAM;
|
||||
INSERT INTO t1 VALUES (6,9);
|
||||
|
||||
CREATE TABLE t2 (f3 INT) ENGINE=MyISAM;
|
||||
INSERT INTO t2 VALUES (2),(0);
|
||||
|
||||
EXPLAIN EXTENDED
|
||||
SELECT f1 FROM ( SELECT * FROM t1 ) AS sq
|
||||
WHERE f1 IN (
|
||||
SELECT f3 FROM t2 WHERE f2 IN (
|
||||
SELECT f3 FROM t2 HAVING f3 >= 8
|
||||
)
|
||||
);
|
||||
|
||||
DROP TABLE t2,t1;
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-9462: Out of memory using explain on 2 empty tables
|
||||
--echo #
|
||||
|
||||
CREATE TABLE `t1` (
|
||||
`REC_GROUP` char(2) DEFAULT NULL,
|
||||
`CLIENT_INFO` text CHARACTER SET utf8,
|
||||
`NAME` text,
|
||||
`PHONE_NUMBER` text,
|
||||
`ATTENTION_NAME` text,
|
||||
`PAYMENT_TERM` text CHARACTER SET utf8,
|
||||
`CREDIT_LIMIT` decimal(12,2) DEFAULT NULL,
|
||||
`LAST_PAY_DATE` text CHARACTER SET utf8,
|
||||
`TOTAL` double DEFAULT NULL,
|
||||
`TOTAL_MCL` double DEFAULT NULL,
|
||||
`TOTAL_MFS` double DEFAULT NULL,
|
||||
`TOTAL_MIS` double DEFAULT NULL,
|
||||
`BEFORE_DUE_7_MCL` double DEFAULT NULL,
|
||||
`BEFORE_DUE_7_MFS` double DEFAULT NULL,
|
||||
`BEFORE_DUE_7_MIS` double DEFAULT NULL,
|
||||
`PER1_MCL` double DEFAULT NULL,
|
||||
`PER1_MFS` double DEFAULT NULL,
|
||||
`PER1_MIS` double DEFAULT NULL,
|
||||
`PER2_MCL` double DEFAULT NULL,
|
||||
`PER2_MFS` double DEFAULT NULL,
|
||||
`PER2_MIS` double DEFAULT NULL,
|
||||
`PER3_MCL` double DEFAULT NULL,
|
||||
`PER3_MFS` double DEFAULT NULL,
|
||||
`PER3_MIS` double DEFAULT NULL,
|
||||
`PER4_MCL` double DEFAULT NULL,
|
||||
`PER4_MFS` double DEFAULT NULL,
|
||||
`PER4_MIS` double DEFAULT NULL,
|
||||
`PER5_MCL` double DEFAULT NULL,
|
||||
`PER5_MFS` double DEFAULT NULL,
|
||||
`PER5_MIS` double DEFAULT NULL,
|
||||
`PER6_MCL` double DEFAULT NULL,
|
||||
`PER6_MFS` double DEFAULT NULL,
|
||||
`PER6_MIS` double DEFAULT NULL,
|
||||
`PER7_MCL` double DEFAULT NULL,
|
||||
`PER7_MFS` double DEFAULT NULL,
|
||||
`PER7_MIS` double DEFAULT NULL,
|
||||
`BEFORE_DUE_7` double DEFAULT NULL,
|
||||
`PER1` double DEFAULT NULL,
|
||||
`PER2` double DEFAULT NULL,
|
||||
`PER3` double DEFAULT NULL,
|
||||
`PER4` double DEFAULT NULL,
|
||||
`PER5` double DEFAULT NULL,
|
||||
`PER6` double DEFAULT NULL,
|
||||
`PER7` double DEFAULT NULL,
|
||||
`REF` varchar(30) DEFAULT NULL,
|
||||
`TYPE` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL
|
||||
);
|
||||
|
||||
|
||||
CREATE TABLE `t2` (
|
||||
`RECEIVABLE_GROUP` char(2) DEFAULT NULL,
|
||||
`CLIENT_NUMBER` varchar(35) DEFAULT NULL,
|
||||
`CLIENT_NAME` varchar(73) DEFAULT NULL,
|
||||
`PHONE_NUMBER` char(12) DEFAULT NULL,
|
||||
`ATTENTION_NAME` char(26) DEFAULT NULL,
|
||||
`PAYMENT_TERM` varchar(26) CHARACTER SET utf8 DEFAULT NULL,
|
||||
`CREDIT_LIMIT` decimal(12,2) DEFAULT NULL,
|
||||
`LAST_PAY_DATE` varchar(42) CHARACTER SET utf8 DEFAULT NULL,
|
||||
`TOTAL` decimal(12,2) DEFAULT NULL,
|
||||
`BEFORE_DUE_7` decimal(12,2) DEFAULT NULL,
|
||||
`PER1` decimal(12,2) DEFAULT NULL,
|
||||
`PER2` decimal(12,2) DEFAULT NULL,
|
||||
`PER3` decimal(12,2) DEFAULT NULL,
|
||||
`PER4` decimal(12,2) DEFAULT NULL,
|
||||
`PER5` decimal(12,2) DEFAULT NULL,
|
||||
`PER6` decimal(12,2) DEFAULT NULL,
|
||||
`PER7` decimal(12,2) DEFAULT NULL,
|
||||
`DIVISION` varchar(3) CHARACTER SET utf8 NOT NULL,
|
||||
`CLIENT_INFO` varchar(294) CHARACTER SET utf8 DEFAULT NULL,
|
||||
`EXCHANGE_RATE` double NOT NULL,
|
||||
`REF` varchar(30) DEFAULT NULL
|
||||
);
|
||||
|
||||
explain
|
||||
SELECT A.RECEIVABLE_GROUP,A.CLIENT_INFO,A.CLIENT_NAME,A.PHONE_NUMBER,A.ATTENTION_NAME,A.PAYMENT_TERM,A.CREDIT_LIMIT,A.LAST_PAY_DATE,A.TOTAL,
|
||||
COALESCE(B.TOTAL_MCL,0) AS TOTAL_MCL,
|
||||
COALESCE(C.TOTAL_MFS,0) AS TOTAL_MFS,
|
||||
COALESCE(D.TOTAL_MIS,0) AS TOTAL_MIS,
|
||||
COALESCE(F.BEFORE_DUE_7_MCL,0) AS BEFORE_DUE_7_MCL,
|
||||
COALESCE(G.BEFORE_DUE_7_MFS,0) AS BEFORE_DUE_7_MFS,
|
||||
COALESCE(H.BEFORE_DUE_7_MIS,0) AS BEFORE_DUE_7_MIS,
|
||||
COALESCE(I.PER1_MCL,0) AS PER1_MCL,
|
||||
COALESCE(J.PER1_MFS,0) AS PER1_MFS,
|
||||
COALESCE(K.PER1_MIS,0) AS PER1_MIS,
|
||||
COALESCE(L.PER2_MCL,0) AS PER2_MCL,
|
||||
COALESCE(M.PER2_MFS,0) AS PER2_MFS,
|
||||
COALESCE(N.PER2_MIS,0) AS PER2_MIS,
|
||||
COALESCE(O.PER3_MCL,0) AS PER3_MCL,
|
||||
COALESCE(P.PER3_MFS,0) AS PER3_MFS,
|
||||
COALESCE(R.PER3_MIS,0) AS PER3_MIS,
|
||||
COALESCE(S.PER4_MCL,0) AS PER4_MCL,
|
||||
COALESCE(T.PER4_MFS,0) AS PER4_MFS,
|
||||
COALESCE(U.PER4_MIS,0) AS PER4_MIS,
|
||||
COALESCE(V.PER5_MCL,0) AS PER5_MCL,
|
||||
COALESCE(X.PER5_MFS,0) AS PER5_MFS,
|
||||
COALESCE(Z.PER5_MIS,0) AS PER5_MIS,
|
||||
COALESCE(Q.PER6_MCL,0) AS PER6_MCL,
|
||||
COALESCE(Y.PER6_MFS,0) AS PER6_MFS,
|
||||
COALESCE(W.PER6_MIS,0) AS PER6_MIS,
|
||||
COALESCE(A1.PER7_MCL,0) AS PER7_MCL,
|
||||
COALESCE(B1.PER7_MFS,0) AS PER7_MFS,
|
||||
COALESCE(C1.PER7_MIS,0) AS PER7_MIS,
|
||||
A.BEFORE_DUE_7,A.PER1,A.PER2,A.PER3,A.PER4,A.PER5,A.PER6,A.PER7,
|
||||
CONCAT(A.DIVISION,'-',A.CLIENT_NUMBER) AS REF,"2" AS TYPE FROM
|
||||
(SELECT RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,
|
||||
GROUP_CONCAT(DISTINCT CLIENT_INFO SEPARATOR '<br>') AS CLIENT_INFO,
|
||||
GROUP_CONCAT(DISTINCT CLIENT_NAME SEPARATOR '<br>') AS CLIENT_NAME,
|
||||
GROUP_CONCAT( DISTINCT `PHONE_NUMBER` SEPARATOR '<br>' ) AS PHONE_NUMBER ,
|
||||
GROUP_CONCAT( DISTINCT `ATTENTION_NAME` SEPARATOR '<br>' ) AS ATTENTION_NAME,
|
||||
GROUP_CONCAT( DISTINCT `PAYMENT_TERM` SEPARATOR '<br>' ) AS PAYMENT_TERM,
|
||||
CREDIT_LIMIT ,
|
||||
GROUP_CONCAT( `LAST_PAY_DATE` SEPARATOR '<br>' ) AS LAST_PAY_DATE,
|
||||
SUM( `TOTAL`*EXCHANGE_RATE ) AS TOTAL,
|
||||
SUM( `BEFORE_DUE_7`*EXCHANGE_RATE ) AS BEFORE_DUE_7,
|
||||
SUM( `PER1`*EXCHANGE_RATE ) AS PER1,
|
||||
SUM( `PER2`*EXCHANGE_RATE ) AS PER2,
|
||||
SUM( `PER3`*EXCHANGE_RATE ) AS PER3,
|
||||
SUM( `PER4`*EXCHANGE_RATE ) AS PER4,
|
||||
SUM( `PER5`*EXCHANGE_RATE ) AS PER5,
|
||||
SUM( `PER6`*EXCHANGE_RATE ) AS PER6,
|
||||
SUM( `PER7`*EXCHANGE_RATE ) AS PER7
|
||||
FROM `t2`
|
||||
WHERE REF IS NULL GROUP BY RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT) AS A
|
||||
LEFT JOIN
|
||||
(SELECT RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT,SUM( `TOTAL`*EXCHANGE_RATE ) AS TOTAL_MCL
|
||||
FROM `t2`
|
||||
WHERE REF IS NULL AND DIVISION="MCL" GROUP BY RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT) AS B ON A.CLIENT_NUMBER=B.CLIENT_NUMBER AND
|
||||
A.DIVISION=B.DIVISION AND A.RECEIVABLE_GROUP=B.RECEIVABLE_GROUP AND A.CREDIT_LIMIT=B.CREDIT_LIMIT
|
||||
LEFT JOIN
|
||||
(SELECT RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT,SUM( `TOTAL`*EXCHANGE_RATE ) AS TOTAL_MFS
|
||||
FROM `t2`
|
||||
WHERE REF IS NULL AND DIVISION="MFS" GROUP BY RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT) AS C ON A.CLIENT_NUMBER=C.CLIENT_NUMBER
|
||||
AND
|
||||
A.DIVISION=C.DIVISION AND A.RECEIVABLE_GROUP=C.RECEIVABLE_GROUP AND A.CREDIT_LIMIT=C.CREDIT_LIMIT
|
||||
LEFT JOIN
|
||||
(SELECT RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT,SUM( `TOTAL`*EXCHANGE_RATE ) AS TOTAL_MIS
|
||||
FROM `t2`
|
||||
WHERE REF IS NULL AND DIVISION="MIS" GROUP BY RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT) AS D ON A.CLIENT_NUMBER=D.CLIENT_NUMBER AND
|
||||
A.DIVISION=D.DIVISION AND A.RECEIVABLE_GROUP=D.RECEIVABLE_GROUP AND A.CREDIT_LIMIT=D.CREDIT_LIMIT
|
||||
LEFT JOIN
|
||||
(SELECT RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT,SUM( BEFORE_DUE_7*EXCHANGE_RATE ) AS BEFORE_DUE_7_MCL
|
||||
FROM `t2`
|
||||
WHERE REF IS NULL AND DIVISION="MCL" GROUP BY RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT) AS F ON A.CLIENT_NUMBER=F.CLIENT_NUMBER AND
|
||||
A.DIVISION=F.DIVISION AND A.RECEIVABLE_GROUP=F.RECEIVABLE_GROUP AND A.CREDIT_LIMIT=F.CREDIT_LIMIT
|
||||
LEFT JOIN
|
||||
(SELECT RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT,SUM( BEFORE_DUE_7*EXCHANGE_RATE ) AS BEFORE_DUE_7_MFS
|
||||
FROM `t2`
|
||||
WHERE REF IS NULL AND DIVISION="MFS" GROUP BY RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT) AS G ON A.CLIENT_NUMBER=G.CLIENT_NUMBER AND
|
||||
A.DIVISION=G.DIVISION AND A.RECEIVABLE_GROUP=G.RECEIVABLE_GROUP AND A.CREDIT_LIMIT=G.CREDIT_LIMIT
|
||||
LEFT JOIN
|
||||
(SELECT RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT,SUM( BEFORE_DUE_7*EXCHANGE_RATE ) AS BEFORE_DUE_7_MIS
|
||||
FROM `t2`
|
||||
WHERE REF IS NULL AND DIVISION="MIS" GROUP BY RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT) AS H ON A.CLIENT_NUMBER=H.CLIENT_NUMBER AND
|
||||
A.DIVISION=H.DIVISION AND A.RECEIVABLE_GROUP=H.RECEIVABLE_GROUP AND A.CREDIT_LIMIT=H.CREDIT_LIMIT
|
||||
LEFT JOIN
|
||||
(SELECT RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT,SUM( PER1*EXCHANGE_RATE ) AS PER1_MCL
|
||||
FROM `t2`
|
||||
WHERE REF IS NULL AND DIVISION="MCL" GROUP BY RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT) AS I ON A.CLIENT_NUMBER=I.CLIENT_NUMBER AND
|
||||
A.DIVISION=I.DIVISION AND A.RECEIVABLE_GROUP=I.RECEIVABLE_GROUP AND A.CREDIT_LIMIT=I.CREDIT_LIMIT
|
||||
LEFT JOIN
|
||||
(SELECT RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT,SUM( PER1*EXCHANGE_RATE ) AS PER1_MFS
|
||||
FROM `t2`
|
||||
WHERE REF IS NULL AND DIVISION="MFS" GROUP BY RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT) AS J ON A.CLIENT_NUMBER=J.CLIENT_NUMBER AND
|
||||
A.DIVISION=J.DIVISION AND A.RECEIVABLE_GROUP=J.RECEIVABLE_GROUP AND A.CREDIT_LIMIT=J.CREDIT_LIMIT
|
||||
LEFT JOIN
|
||||
(SELECT RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT,SUM( PER1*EXCHANGE_RATE ) AS PER1_MIS
|
||||
FROM `t2`
|
||||
WHERE REF IS NULL AND DIVISION="MIS" GROUP BY RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT) AS K ON A.CLIENT_NUMBER=K.CLIENT_NUMBER AND
|
||||
A.DIVISION=K.DIVISION AND A.RECEIVABLE_GROUP=K.RECEIVABLE_GROUP AND A.CREDIT_LIMIT=K.CREDIT_LIMIT
|
||||
LEFT JOIN
|
||||
(SELECT RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT,SUM( PER2*EXCHANGE_RATE ) AS PER2_MCL
|
||||
FROM `t2`
|
||||
WHERE REF IS NULL AND DIVISION="MCL" GROUP BY RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT) AS L ON A.CLIENT_NUMBER=L.CLIENT_NUMBER AND
|
||||
A.DIVISION=L.DIVISION AND A.RECEIVABLE_GROUP=L.RECEIVABLE_GROUP AND A.CREDIT_LIMIT=L.CREDIT_LIMIT
|
||||
LEFT JOIN
|
||||
(SELECT RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT,SUM( PER2*EXCHANGE_RATE ) AS PER2_MFS
|
||||
FROM `t2`
|
||||
WHERE REF IS NULL AND DIVISION="MFS" GROUP BY RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT) AS M ON A.CLIENT_NUMBER=M.CLIENT_NUMBER AND
|
||||
A.DIVISION=M.DIVISION AND A.RECEIVABLE_GROUP=M.RECEIVABLE_GROUP AND A.CREDIT_LIMIT=M.CREDIT_LIMIT
|
||||
LEFT JOIN
|
||||
(SELECT RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT,SUM( PER2*EXCHANGE_RATE ) AS PER2_MIS
|
||||
FROM `t2`
|
||||
WHERE REF IS NULL AND DIVISION="MIS" GROUP BY RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT) AS N ON A.CLIENT_NUMBER=N.CLIENT_NUMBER AND
|
||||
A.DIVISION=N.DIVISION AND A.RECEIVABLE_GROUP=N.RECEIVABLE_GROUP AND A.CREDIT_LIMIT=N.CREDIT_LIMIT
|
||||
LEFT JOIN
|
||||
(SELECT RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT,SUM( PER3*EXCHANGE_RATE ) AS PER3_MCL
|
||||
FROM `t2`
|
||||
WHERE REF IS NULL AND DIVISION="MCL" GROUP BY RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT) AS O ON A.CLIENT_NUMBER=O.CLIENT_NUMBER AND
|
||||
A.DIVISION=O.DIVISION AND A.RECEIVABLE_GROUP=O.RECEIVABLE_GROUP AND A.CREDIT_LIMIT=O.CREDIT_LIMIT
|
||||
LEFT JOIN
|
||||
(SELECT RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT,SUM( PER3*EXCHANGE_RATE ) AS PER3_MFS
|
||||
FROM `t2`
|
||||
WHERE REF IS NULL AND DIVISION="MFS" GROUP BY RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT) AS P ON A.CLIENT_NUMBER=P.CLIENT_NUMBER AND
|
||||
A.DIVISION=P.DIVISION AND A.RECEIVABLE_GROUP=P.RECEIVABLE_GROUP AND A.CREDIT_LIMIT=P.CREDIT_LIMIT
|
||||
LEFT JOIN
|
||||
(SELECT RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT,SUM( PER3*EXCHANGE_RATE ) AS PER3_MIS
|
||||
FROM `t2`
|
||||
WHERE REF IS NULL AND DIVISION="MIS" GROUP BY RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT) AS R ON A.CLIENT_NUMBER=R.CLIENT_NUMBER AND
|
||||
A.DIVISION=R.DIVISION AND A.RECEIVABLE_GROUP=R.RECEIVABLE_GROUP AND A.CREDIT_LIMIT=R.CREDIT_LIMIT
|
||||
LEFT JOIN
|
||||
(SELECT RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT,SUM( PER4*EXCHANGE_RATE ) AS PER4_MCL
|
||||
FROM `t2`
|
||||
WHERE REF IS NULL AND DIVISION="MCL" GROUP BY RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT) AS S ON A.CLIENT_NUMBER=S.CLIENT_NUMBER AND
|
||||
A.DIVISION=S.DIVISION AND A.RECEIVABLE_GROUP=S.RECEIVABLE_GROUP AND A.CREDIT_LIMIT=S.CREDIT_LIMIT
|
||||
LEFT JOIN
|
||||
(SELECT RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT,SUM( PER4*EXCHANGE_RATE ) AS PER4_MFS
|
||||
FROM `t2`
|
||||
WHERE REF IS NULL AND DIVISION="MFS" GROUP BY RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT) AS T ON A.CLIENT_NUMBER=T.CLIENT_NUMBER AND
|
||||
A.DIVISION=T.DIVISION AND A.RECEIVABLE_GROUP=T.RECEIVABLE_GROUP AND A.CREDIT_LIMIT=T.CREDIT_LIMIT
|
||||
LEFT JOIN
|
||||
(SELECT RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT,SUM( PER4*EXCHANGE_RATE ) AS PER4_MIS
|
||||
FROM `t2`
|
||||
WHERE REF IS NULL AND DIVISION="MIS" GROUP BY RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT) AS U ON A.CLIENT_NUMBER=U.CLIENT_NUMBER AND
|
||||
A.DIVISION=U.DIVISION AND A.RECEIVABLE_GROUP=U.RECEIVABLE_GROUP AND A.CREDIT_LIMIT=U.CREDIT_LIMIT
|
||||
LEFT JOIN
|
||||
(SELECT RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT,SUM( PER5*EXCHANGE_RATE ) AS PER5_MCL
|
||||
FROM `t2`
|
||||
WHERE REF IS NULL AND DIVISION="MCL" GROUP BY RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT) AS V ON A.CLIENT_NUMBER=V.CLIENT_NUMBER AND
|
||||
A.DIVISION=V.DIVISION AND A.RECEIVABLE_GROUP=V.RECEIVABLE_GROUP AND A.CREDIT_LIMIT=V.CREDIT_LIMIT
|
||||
LEFT JOIN
|
||||
(SELECT RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT,SUM( PER5*EXCHANGE_RATE ) AS PER5_MFS
|
||||
FROM `t2`
|
||||
WHERE REF IS NULL AND DIVISION="MFS" GROUP BY RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT) AS X ON A.CLIENT_NUMBER=X.CLIENT_NUMBER AND
|
||||
A.DIVISION=X.DIVISION AND A.RECEIVABLE_GROUP=X.RECEIVABLE_GROUP AND A.CREDIT_LIMIT=X.CREDIT_LIMIT
|
||||
LEFT JOIN
|
||||
(SELECT RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT,SUM( PER5*EXCHANGE_RATE ) AS PER5_MIS
|
||||
FROM `t2`
|
||||
WHERE REF IS NULL AND DIVISION="MIS" GROUP BY RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT) AS Z ON A.CLIENT_NUMBER=Z.CLIENT_NUMBER AND
|
||||
A.DIVISION=Z.DIVISION AND A.RECEIVABLE_GROUP=Z.RECEIVABLE_GROUP AND A.CREDIT_LIMIT=Z.CREDIT_LIMIT
|
||||
LEFT JOIN
|
||||
(SELECT RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT,SUM( PER6*EXCHANGE_RATE ) AS PER6_MCL
|
||||
FROM `t2`
|
||||
WHERE REF IS NULL AND DIVISION="MCL" GROUP BY RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT) AS Q ON A.CLIENT_NUMBER=Q.CLIENT_NUMBER AND
|
||||
A.DIVISION=Q.DIVISION AND A.RECEIVABLE_GROUP=Q.RECEIVABLE_GROUP AND A.CREDIT_LIMIT=Q.CREDIT_LIMIT
|
||||
LEFT JOIN
|
||||
(SELECT RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT,SUM( PER6*EXCHANGE_RATE ) AS PER6_MFS
|
||||
FROM `t2`
|
||||
WHERE REF IS NULL AND DIVISION="MFS" GROUP BY RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT) AS Y ON A.CLIENT_NUMBER=Y.CLIENT_NUMBER AND
|
||||
A.DIVISION=Y.DIVISION AND A.RECEIVABLE_GROUP=Y.RECEIVABLE_GROUP AND A.CREDIT_LIMIT=Y.CREDIT_LIMIT
|
||||
LEFT JOIN
|
||||
(SELECT RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT,SUM( PER6*EXCHANGE_RATE ) AS PER6_MIS
|
||||
FROM `t2`
|
||||
WHERE REF IS NULL AND DIVISION="MIS" GROUP BY RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT) AS W ON A.CLIENT_NUMBER=W.CLIENT_NUMBER AND
|
||||
A.DIVISION=W.DIVISION AND A.RECEIVABLE_GROUP=W.RECEIVABLE_GROUP AND A.CREDIT_LIMIT=W.CREDIT_LIMIT
|
||||
LEFT JOIN
|
||||
(SELECT RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT,SUM( PER7*EXCHANGE_RATE ) AS PER7_MCL
|
||||
FROM `t2`
|
||||
WHERE REF IS NULL AND DIVISION="MCL" GROUP BY RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT) AS A1 ON A.CLIENT_NUMBER=A1.CLIENT_NUMBER AND
|
||||
A.DIVISION=A1.DIVISION AND A.RECEIVABLE_GROUP=A1.RECEIVABLE_GROUP AND A.CREDIT_LIMIT=A1.CREDIT_LIMIT
|
||||
LEFT JOIN
|
||||
(SELECT RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT,SUM( PER7*EXCHANGE_RATE ) AS PER7_MFS
|
||||
FROM `t2`
|
||||
WHERE REF IS NULL AND DIVISION="MFS" GROUP BY RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT) AS B1 ON A.CLIENT_NUMBER=B1.CLIENT_NUMBER AND
|
||||
A.DIVISION=B1.DIVISION AND A.RECEIVABLE_GROUP=B1.RECEIVABLE_GROUP AND A.CREDIT_LIMIT=B1.CREDIT_LIMIT
|
||||
LEFT JOIN
|
||||
(SELECT RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT,SUM( PER7*EXCHANGE_RATE ) AS PER7_MIS
|
||||
FROM `t2`
|
||||
WHERE REF IS NULL AND DIVISION="MIS" GROUP BY RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT) AS C1 ON A.CLIENT_NUMBER=C1.CLIENT_NUMBER AND
|
||||
A.DIVISION=C1.DIVISION AND A.RECEIVABLE_GROUP=C1.RECEIVABLE_GROUP AND A.CREDIT_LIMIT=C1.CREDIT_LIMIT
|
||||
ORDER BY TOTAL DESC;
|
||||
|
||||
DROP TABLES t1,t2;
|
||||
|
||||
set optimizer_switch=@save_derived_optimizer_switch;
|
||||
|
@ -1041,6 +1041,24 @@ insert into t1 values ('00:00:00'),('00:01:00');
|
||||
select 1 from t1 where 1 < some (select cast(a as datetime) from t1);
|
||||
drop table t1;
|
||||
|
||||
--echo #
|
||||
--echo # Bug #21564557: INCONSISTENT OUTPUT FROM 5.5 AND 5.6
|
||||
--echo # UNIX_TIMESTAMP(STR_TO_DATE('201506', "%Y%M"
|
||||
--echo #
|
||||
|
||||
SELECT UNIX_TIMESTAMP(STR_TO_DATE('201506', "%Y%m"));
|
||||
SELECT UNIX_TIMESTAMP('2015-06-00');
|
||||
SELECT UNIX_TIMESTAMP(STR_TO_DATE('0000-00-00 10:30:30', '%Y-%m-%d %h:%i:%s'));
|
||||
|
||||
set sql_mode= 'TRADITIONAL';
|
||||
SELECT @@sql_mode;
|
||||
|
||||
SELECT UNIX_TIMESTAMP(STR_TO_DATE('201506', "%Y%m"));
|
||||
SELECT UNIX_TIMESTAMP('2015-06-00');
|
||||
SELECT UNIX_TIMESTAMP(STR_TO_DATE('0000-00-00 10:30:30', '%Y-%m-%d %h:%i:%s'));
|
||||
|
||||
set sql_mode= default;
|
||||
|
||||
select time('10:10:10') > 10;
|
||||
select time('10:10:10') > 1010;
|
||||
select time('10:10:09') > 101010;
|
||||
|
@ -39,3 +39,34 @@ SELECT * FROM t2;
|
||||
SELECT * FROM t1;
|
||||
DROP TABLE t1, t2, t3, t4, t5;
|
||||
|
||||
#
|
||||
# Bug#20691429 temporary merge over view under lock tables
|
||||
#
|
||||
create table t1 (c1 varchar(100));
|
||||
create table t2 (c1 varchar(100));
|
||||
create view t3 as select * from t1;
|
||||
insert into t1 values ('ann'), ('alice');
|
||||
insert into t2 values ('bob'), ('brian');
|
||||
create temporary table t4 (c1 varchar(100)) engine=MERGE union=(t2, t1);
|
||||
create temporary table t5 (c1 varchar(100)) engine=MERGE union=(t3, t1);
|
||||
--error ER_WRONG_MRG_TABLE
|
||||
select * from t5;
|
||||
lock tables t1 read, t2 read, t3 read, t4 read;
|
||||
--error ER_WRONG_MRG_TABLE
|
||||
select * from t5;
|
||||
select * from t4;
|
||||
unlock tables;
|
||||
drop table t2;
|
||||
create view t2 as select * from t1;
|
||||
--error ER_WRONG_MRG_TABLE
|
||||
select * from t4;
|
||||
lock tables t1 read, t2 read, t3 read;
|
||||
--error ER_WRONG_MRG_TABLE
|
||||
select * from t4;
|
||||
--error ER_WRONG_MRG_TABLE
|
||||
select * from t4;
|
||||
--error ER_WRONG_MRG_TABLE
|
||||
select * from t4;
|
||||
unlock tables;
|
||||
drop view t2, t3;
|
||||
drop table t1;
|
||||
|
@ -157,5 +157,30 @@ rename table mysql.ev_bk to mysql.event;
|
||||
|
||||
drop table if exists kv;
|
||||
drop view v1,v2,v3,v4;
|
||||
drop table t1;
|
||||
|
||||
#
|
||||
# MDEV-9453 mysql_upgrade.exe error when mysql is migrated to mariadb
|
||||
# (mysql_upgrade.exe --upgrade-system-tables fails on fixing views)
|
||||
#
|
||||
|
||||
# Make it look like a MySQL directory again
|
||||
|
||||
rename table mysql.event to mysql.ev_bk;
|
||||
--copy_file $MYSQL_TEST_DIR/std_data/mysql_upgrade/event.MYI $MYSQLD_DATADIR/mysql/event.MYI
|
||||
--copy_file $MYSQL_TEST_DIR/std_data/mysql_upgrade/event.MYD $MYSQLD_DATADIR/mysql/event.MYD
|
||||
--copy_file $MYSQL_TEST_DIR/std_data/mysql_upgrade/event.frm $MYSQLD_DATADIR/mysql/event.frm
|
||||
|
||||
--copy_file $MYSQL_TEST_DIR/std_data/mysql_upgrade/v1.frm $MYSQLD_DATADIR/test/v1.frm
|
||||
--copy_file $MYSQL_TEST_DIR/std_data/mysql_upgrade/v2.frm $MYSQLD_DATADIR/test/v2.frm
|
||||
--copy_file $MYSQL_TEST_DIR/std_data/mysql_upgrade/v3.frm $MYSQLD_DATADIR/test/v3.frm
|
||||
|
||||
flush tables;
|
||||
|
||||
--replace_result $MYSQLTEST_VARDIR var
|
||||
--exec $MYSQL_UPGRADE --force --upgrade-system-tables 2>&1
|
||||
|
||||
# back to mariadb default
|
||||
drop table mysql.event;
|
||||
rename table mysql.ev_bk to mysql.event;
|
||||
drop view v1,v2,v3;
|
||||
drop table t1;
|
||||
|
9
mysql-test/t/second_frac-9175.test
Normal file
9
mysql-test/t/second_frac-9175.test
Normal file
@ -0,0 +1,9 @@
|
||||
#
|
||||
# MDEV-9175 Query parser tansforms MICROSECOND into SECOND_FRAC, which does not work
|
||||
#
|
||||
|
||||
select timestampdiff(microsecond,'2000-01-01 00:00:00','2001-01-01 00:00:00.123456');
|
||||
explain extended select timestampdiff(microsecond,'2000-01-01 00:00:00','2001-01-01 00:00:00.123456');
|
||||
create view v1 as select timestampdiff(microsecond,'2000-01-01 00:00:00','2001-01-01 00:00:00.123456');
|
||||
select * from v1;
|
||||
drop view v1;
|
43
mysql-test/t/ssl_cert_verify.test
Normal file
43
mysql-test/t/ssl_cert_verify.test
Normal file
@ -0,0 +1,43 @@
|
||||
# Want to skip this test from Valgrind execution
|
||||
--source include/no_valgrind_without_big.inc
|
||||
# This test should work in embedded server after we fix mysqltest
|
||||
-- source include/not_embedded.inc
|
||||
-- source include/have_ssl_communication.inc
|
||||
# Save the initial number of concurrent sessions
|
||||
--source include/count_sessions.inc
|
||||
|
||||
let $ssl_verify_fail_path = --ssl --ssl-ca=$MYSQL_TEST_DIR/std_data/ca-cert-verify.pem --ssl-key=$MYSQL_TEST_DIR/std_data/server-key-verify-fail.pem --ssl-cert=$MYSQL_TEST_DIR/std_data/server-cert-verify-fail.pem;
|
||||
let $ssl_verify_pass_path = --ssl --ssl-ca=$MYSQL_TEST_DIR/std_data/ca-cert-verify.pem --ssl-key=$MYSQL_TEST_DIR/std_data/server-key-verify-pass.pem --ssl-cert=$MYSQL_TEST_DIR/std_data/server-cert-verify-pass.pem;
|
||||
|
||||
--echo #T1: Host name (/CN=localhost/) as OU name in the server certificate, server certificate verification should fail.
|
||||
--exec echo "wait" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect
|
||||
--shutdown_server
|
||||
--source include/wait_until_disconnected.inc
|
||||
|
||||
--exec echo "restart:" $ssl_verify_fail_path > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect
|
||||
--enable_reconnect
|
||||
--source include/wait_until_connected_again.inc
|
||||
|
||||
--error 1
|
||||
--exec $MYSQL --protocol=tcp --ssl-ca=$MYSQL_TEST_DIR/std_data/ca-cert-verify.pem --ssl-verify-server-cert -e "SHOW STATUS like 'Ssl_version'"
|
||||
|
||||
--echo #T2: Host name (localhost) as common name in the server certificate, server certificate verification should pass.
|
||||
--exec echo "wait" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect
|
||||
--shutdown_server
|
||||
--source include/wait_until_disconnected.inc
|
||||
|
||||
--exec echo "restart:" $ssl_verify_pass_path > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect
|
||||
--enable_reconnect
|
||||
--source include/wait_until_connected_again.inc
|
||||
|
||||
--replace_result TLSv1.2 TLS_VERSION TLSv1.1 TLS_VERSION TLSv1 TLS_VERSION
|
||||
--exec $MYSQL --protocol=tcp --ssl-ca=$MYSQL_TEST_DIR/std_data/ca-cert-verify.pem --ssl-verify-server-cert -e "SHOW STATUS like 'Ssl_version'"
|
||||
|
||||
--echo # restart server using restart
|
||||
--exec echo "wait" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect
|
||||
--shutdown_server
|
||||
--source include/wait_until_disconnected.inc
|
||||
|
||||
--exec echo "restart: " > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect
|
||||
--enable_reconnect
|
||||
--source include/wait_until_connected_again.inc
|
@ -5965,6 +5965,17 @@ EXECUTE stmt;
|
||||
deallocate prepare stmt;
|
||||
drop table t1,t2,t3,t4;
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-7122
|
||||
--echo # Assertion `0' failed in subselect_hash_sj_engine::init
|
||||
--echo #
|
||||
SET SESSION big_tables=1;
|
||||
CREATE TABLE t1(a char(255) DEFAULT '', KEY(a(10))) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
|
||||
INSERT INTO t1 VALUES(0),(0),(0);
|
||||
SELECT * FROM t1 WHERE a IN(SELECT MIN(a) FROM t1);
|
||||
DROP TABLE t1;
|
||||
SET SESSION big_tables=0;
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-7930: Assertion `table_share->tmp_table != NO_TMP_TABLE ||
|
||||
--echo # m_lock_type != 2' failed in handler::ha_index_read_map
|
||||
|
@ -2704,5 +2704,74 @@ explain
|
||||
select 1 from t1 where _cp932 "1" in (select '1' from t1);
|
||||
drop table t1;
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-7823: Server crashes in next_depth_first_tab on nested IN clauses with SQ inside
|
||||
--echo #
|
||||
set @tmp_mdev7823=@@optimizer_switch;
|
||||
set optimizer_switch=default;
|
||||
CREATE TABLE t1 (f1 INT);
|
||||
INSERT INTO t1 VALUES (1);
|
||||
|
||||
CREATE TABLE t2 (f2 INT, KEY(f2));
|
||||
INSERT INTO t2 VALUES (8),(0);
|
||||
|
||||
CREATE TABLE t3 (f3 INT);
|
||||
INSERT INTO t3 VALUES (1),(2);
|
||||
|
||||
CREATE TABLE t4 (f4 INT);
|
||||
INSERT INTO t4 VALUES (0),(5);
|
||||
|
||||
explain
|
||||
SELECT * FROM t1, t2, t3 WHERE f2 IN ( f1 IN ( SELECT f4 FROM t4 ) );
|
||||
SELECT * FROM t1, t2, t3 WHERE f2 IN ( f1 IN ( SELECT f4 FROM t4 ) );
|
||||
|
||||
drop table t1,t2,t3,t4;
|
||||
set optimizer_switch= @tmp_mdev7823;
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-6859: scalar subqueries in a comparison produced unexpected result
|
||||
--echo #
|
||||
set @tmp_mdev6859=@@optimizer_switch;
|
||||
set optimizer_switch=default;
|
||||
CREATE TABLE t1 (
|
||||
project_number varchar(50) NOT NULL,
|
||||
PRIMARY KEY (project_number)
|
||||
) ENGINE=MyISAM;
|
||||
|
||||
INSERT INTO t1 (project_number) VALUES ('aaa'),('bbb');
|
||||
|
||||
CREATE TABLE t2 (
|
||||
id int(10) unsigned NOT NULL AUTO_INCREMENT,
|
||||
project_number varchar(50) NOT NULL,
|
||||
history_date date NOT NULL,
|
||||
country varchar(50) NOT NULL,
|
||||
PRIMARY KEY (id)
|
||||
) ENGINE=MyISAM;
|
||||
|
||||
INSERT INTO t2 (id, project_number, history_date, country) VALUES
|
||||
(1, 'aaa', '2014-08-09', 'france'),(2, 'aaa', '2014-09-09', 'singapore');
|
||||
|
||||
CREATE TABLE t3 (
|
||||
region varchar(50) NOT NULL,
|
||||
country varchar(50) NOT NULL
|
||||
) ENGINE=MyISAM;
|
||||
|
||||
INSERT INTO t3 (region, country) VALUES ('apac', 'singapore'),('eame', 'france');
|
||||
|
||||
SELECT SQL_NO_CACHE a.project_number
|
||||
FROM t1 a
|
||||
WHERE ( SELECT z.country
|
||||
FROM t2 z
|
||||
WHERE z.project_number = a.project_number AND z.history_date <= '2014-09-01'
|
||||
ORDER BY z.id DESC LIMIT 1
|
||||
) IN (
|
||||
SELECT r.country
|
||||
FROM t3 r
|
||||
WHERE r.region = 'eame'
|
||||
);
|
||||
|
||||
drop table t1, t2, t3;
|
||||
set optimizer_switch= @tmp_mdev6859;
|
||||
|
||||
# The following command must be the last one the file
|
||||
set optimizer_switch=@subselect_sj_tmp;
|
||||
|
@ -5480,6 +5480,16 @@ deallocate prepare stmt;
|
||||
|
||||
drop view v1,v2;
|
||||
drop table `t1`;
|
||||
|
||||
#
|
||||
# Bug#19817021
|
||||
#
|
||||
create table t1 (a int, b int);
|
||||
create view v1 as select a+b from t1;
|
||||
alter table v1 check partition p1;
|
||||
drop view v1;
|
||||
drop table t1;
|
||||
|
||||
--echo # -----------------------------------------------------------------
|
||||
--echo # -- End of 5.5 tests.
|
||||
--echo # -----------------------------------------------------------------
|
||||
|
@ -1,5 +1,5 @@
|
||||
# Copyright (c) 2005, 2011, Oracle and/or its affiliates.
|
||||
# Copyright (c) 2008-2011, Monty Program Ab
|
||||
# Copyright (c) 2005, 2015, Oracle and/or its affiliates.
|
||||
# Copyright (c) 2008, 2016, MariaDB
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU Library General Public
|
||||
@ -1097,8 +1097,8 @@
|
||||
# write_keys() and find_all_keys().
|
||||
# They both return ha_rows, which is platform dependent.
|
||||
#
|
||||
# The '...' wildcards are for 'fun:inline_mysql_file_write' which *may*
|
||||
# be inlined.
|
||||
# The '...' wildcards are for 'fun:inline_mysql_file_write' and
|
||||
# 'fun:find_all_keys' which *may* be inlined.
|
||||
{
|
||||
Bug#12856915 VALGRIND FAILURE IN FILESORT/CREATE_SORT_INDEX / one
|
||||
Memcheck:Param
|
||||
@ -1109,7 +1109,7 @@
|
||||
fun:my_b_flush_io_cache
|
||||
fun:_my_b_write
|
||||
fun:_Z*10write_keysP13st_sort_paramPPhjP11st_io_cacheS4_
|
||||
fun:_Z*13find_all_keysP13st_sort_paramP10SQL_SELECTPPhP11st_io_cacheS6_
|
||||
...
|
||||
fun:_Z8filesortP3THDP5TABLEP13st_sort_fieldjP10SQL_SELECTybPy
|
||||
}
|
||||
|
||||
|
@ -1,4 +1,5 @@
|
||||
/* Copyright (c) 2006, 2010, Oracle and/or its affiliates. All rights reserved.
|
||||
/* Copyright (c) 2006, 2010, Oracle and/or its affiliates.
|
||||
Copyright (c) 2009, 2016, MariaDB
|
||||
|
||||
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
|
||||
|
@ -577,6 +577,7 @@ int my_load_defaults(const char *conf_file, const char **groups,
|
||||
handle_default_option, (void *) &ctx,
|
||||
dirs)))
|
||||
{
|
||||
delete_dynamic(&args);
|
||||
free_root(&alloc,MYF(0));
|
||||
DBUG_RETURN(error);
|
||||
}
|
||||
|
@ -72,7 +72,7 @@ err:
|
||||
return res;
|
||||
}
|
||||
|
||||
#elif defined(__linux__) || defined(__sun__)
|
||||
#elif defined(__linux__) || defined(__sun)
|
||||
#include <net/if.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include <net/if_arp.h>
|
||||
|
@ -1,4 +1,5 @@
|
||||
/* Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.
|
||||
/* Copyright (c) 2000, 2014, Oracle and/or its affiliates.
|
||||
Copyright (c) 2011, 2016, MariaDB
|
||||
|
||||
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
|
||||
|
@ -142,16 +142,16 @@ my_bool dynstr_trunc(DYNAMIC_STRING *str, size_t n)
|
||||
my_bool dynstr_append_os_quoted(DYNAMIC_STRING *str, const char *append, ...)
|
||||
{
|
||||
#ifdef __WIN__
|
||||
const char *quote_str= "\"";
|
||||
const uint quote_len= 1;
|
||||
LEX_CSTRING quote= { C_STRING_WITH_LEN("\"") };
|
||||
LEX_CSTRING replace= { C_STRING_WITH_LEN("\\\"") };
|
||||
#else
|
||||
const char *quote_str= "\'";
|
||||
const uint quote_len= 1;
|
||||
LEX_CSTRING quote= { C_STRING_WITH_LEN("\'") };
|
||||
LEX_CSTRING replace= { C_STRING_WITH_LEN("'\"'\"'") };
|
||||
#endif /* __WIN__ */
|
||||
my_bool ret= TRUE;
|
||||
va_list dirty_text;
|
||||
|
||||
ret&= dynstr_append_mem(str, quote_str, quote_len); /* Leading quote */
|
||||
ret&= dynstr_append_mem(str, quote.str, quote.length); /* Leading quote */
|
||||
va_start(dirty_text, append);
|
||||
while (append != NullS)
|
||||
{
|
||||
@ -159,18 +159,17 @@ my_bool dynstr_append_os_quoted(DYNAMIC_STRING *str, const char *append, ...)
|
||||
const char *next_pos= cur_pos;
|
||||
|
||||
/* Search for quote in each string and replace with escaped quote */
|
||||
while(*(next_pos= strcend(cur_pos, quote_str[0])) != '\0')
|
||||
while(*(next_pos= strcend(cur_pos, quote.str[0])) != '\0')
|
||||
{
|
||||
ret&= dynstr_append_mem(str, cur_pos, (uint) (next_pos - cur_pos));
|
||||
ret&= dynstr_append_mem(str ,"\\", 1);
|
||||
ret&= dynstr_append_mem(str, quote_str, quote_len);
|
||||
ret&= dynstr_append_mem(str, replace.str, replace.length);
|
||||
cur_pos= next_pos + 1;
|
||||
}
|
||||
ret&= dynstr_append_mem(str, cur_pos, (uint) (next_pos - cur_pos));
|
||||
append= va_arg(dirty_text, char *);
|
||||
}
|
||||
va_end(dirty_text);
|
||||
ret&= dynstr_append_mem(str, quote_str, quote_len); /* Trailing quote */
|
||||
ret&= dynstr_append_mem(str, quote.str, quote.length); /* Trailing quote */
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
@ -29,7 +29,7 @@ ulong debug_startup_interval, debug_first_interval, debug_interval;
|
||||
char server_uid_buf[SERVER_UID_SIZE+1]; ///< server uid will be written here
|
||||
|
||||
/* backing store for system variables */
|
||||
static char *server_uid= server_uid_buf, *url;
|
||||
static char *server_uid= server_uid_buf, *url, *http_proxy;
|
||||
char *user_info;
|
||||
ulong send_timeout, send_retry_wait;
|
||||
|
||||
@ -285,7 +285,13 @@ static int init(void *p)
|
||||
if (*e == 0 || *e == ' ')
|
||||
{
|
||||
if (e > s && (urls[slot]= Url::create(s, e - s)))
|
||||
{
|
||||
if (urls[slot]->set_proxy(http_proxy,
|
||||
http_proxy ? strlen(http_proxy) : 0))
|
||||
sql_print_error("feedback plugin: invalid proxy '%s'",
|
||||
http_proxy ? http_proxy : "");
|
||||
slot++;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (e > s)
|
||||
@ -363,6 +369,9 @@ static MYSQL_SYSVAR_ULONG(send_timeout, send_timeout, PLUGIN_VAR_RQCMDARG,
|
||||
static MYSQL_SYSVAR_ULONG(send_retry_wait, send_retry_wait, PLUGIN_VAR_RQCMDARG,
|
||||
"Wait this many seconds before retrying a failed send.",
|
||||
NULL, NULL, 60, 1, 60*60*24, 1);
|
||||
static MYSQL_SYSVAR_STR(http_proxy, http_proxy,
|
||||
PLUGIN_VAR_READONLY | PLUGIN_VAR_RQCMDARG,
|
||||
"Proxy server host:port.", NULL, NULL,0);
|
||||
|
||||
#ifndef DBUG_OFF
|
||||
static MYSQL_SYSVAR_ULONG(debug_startup_interval, debug_startup_interval,
|
||||
@ -382,6 +391,7 @@ static struct st_mysql_sys_var* settings[] = {
|
||||
MYSQL_SYSVAR(url),
|
||||
MYSQL_SYSVAR(send_timeout),
|
||||
MYSQL_SYSVAR(send_retry_wait),
|
||||
MYSQL_SYSVAR(http_proxy),
|
||||
#ifndef DBUG_OFF
|
||||
MYSQL_SYSVAR(debug_startup_interval),
|
||||
MYSQL_SYSVAR(debug_first_interval),
|
||||
|
@ -52,8 +52,14 @@ class Url {
|
||||
const char *url() { return full_url.str; }
|
||||
size_t url_length() { return full_url.length; }
|
||||
virtual int send(const char* data, size_t data_length) = 0;
|
||||
virtual int set_proxy(const char *proxy, size_t proxy_len)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static Url* create(const char *url, size_t url_length);
|
||||
static int parse_proxy_server(const char *proxy_server, size_t proxy_length,
|
||||
LEX_STRING *host, LEX_STRING *port);
|
||||
};
|
||||
|
||||
extern Url **urls;
|
||||
|
@ -48,4 +48,49 @@ Url* Url::create(const char *url, size_t url_length)
|
||||
return self;
|
||||
}
|
||||
|
||||
int Url::parse_proxy_server(const char *proxy_server, size_t proxy_length,
|
||||
LEX_STRING *host, LEX_STRING *port)
|
||||
{
|
||||
const char *s;
|
||||
|
||||
host->length= 0;
|
||||
if (proxy_server == NULL)
|
||||
return 0;
|
||||
|
||||
for (; proxy_length > 0 && my_isspace(system_charset_info, *proxy_server);
|
||||
proxy_server++, proxy_length--) /* no-op */;
|
||||
|
||||
if (proxy_length == 0)
|
||||
return 0;
|
||||
|
||||
for (s=proxy_server; *s && *s != ':'; s++) /* no-op */;
|
||||
|
||||
host->str= const_cast<char*>(proxy_server);
|
||||
if ((host->length= s-proxy_server) == 0)
|
||||
return 0;
|
||||
|
||||
port->length= 0;
|
||||
|
||||
if (*s == ':')
|
||||
{
|
||||
s++;
|
||||
port->str= const_cast<char*>(s);
|
||||
while (*s >= '0' && *s <= '9')
|
||||
{
|
||||
s++;
|
||||
port->length++;
|
||||
}
|
||||
}
|
||||
|
||||
if (port->length == 0)
|
||||
{
|
||||
port->str= const_cast<char*>("80");
|
||||
port->length= 2;
|
||||
}
|
||||
|
||||
host->str= my_strndup(host->str, host->length, MYF(MY_WME));
|
||||
port->str= my_strndup(port->str, port->length, MYF(MY_WME));
|
||||
return 0;
|
||||
}
|
||||
|
||||
} // namespace feedback
|
||||
|
@ -38,20 +38,39 @@ class Url_http: public Url {
|
||||
protected:
|
||||
const LEX_STRING host, port, path;
|
||||
bool ssl;
|
||||
LEX_STRING proxy_host, proxy_port;
|
||||
|
||||
int use_proxy()
|
||||
{
|
||||
return proxy_host.length;
|
||||
}
|
||||
|
||||
Url_http(LEX_STRING &url_arg, LEX_STRING &host_arg,
|
||||
LEX_STRING &port_arg, LEX_STRING &path_arg, bool ssl_arg) :
|
||||
Url(url_arg), host(host_arg), port(port_arg), path(path_arg), ssl(ssl_arg)
|
||||
{}
|
||||
{
|
||||
proxy_host.length= 0;
|
||||
}
|
||||
~Url_http()
|
||||
{
|
||||
my_free(host.str);
|
||||
my_free(port.str);
|
||||
my_free(path.str);
|
||||
set_proxy(0,0);
|
||||
}
|
||||
|
||||
public:
|
||||
int send(const char* data, size_t data_length);
|
||||
int set_proxy(const char *proxy, size_t proxy_len)
|
||||
{
|
||||
if (use_proxy())
|
||||
{
|
||||
my_free(proxy_host.str);
|
||||
my_free(proxy_port.str);
|
||||
}
|
||||
|
||||
return parse_proxy_server(proxy, proxy_len, &proxy_host, &proxy_port);
|
||||
}
|
||||
|
||||
friend Url* http_create(const char *url, size_t url_length);
|
||||
};
|
||||
@ -150,7 +169,9 @@ int Url_http::send(const char* data, size_t data_length)
|
||||
uint len= 0;
|
||||
|
||||
addrinfo *addrs, *addr, filter= {0, AF_UNSPEC, SOCK_STREAM, 6, 0, 0, 0, 0};
|
||||
int res= getaddrinfo(host.str, port.str, &filter, &addrs);
|
||||
int res= use_proxy() ?
|
||||
getaddrinfo(proxy_host.str, proxy_port.str, &filter, &addrs) :
|
||||
getaddrinfo(host.str, port.str, &filter, &addrs);
|
||||
|
||||
if (res)
|
||||
{
|
||||
@ -228,16 +249,20 @@ int Url_http::send(const char* data, size_t data_length)
|
||||
};
|
||||
|
||||
len= my_snprintf(buf, sizeof(buf),
|
||||
"POST %s HTTP/1.0\r\n"
|
||||
"User-Agent: MariaDB User Feedback Plugin\r\n"
|
||||
"Host: %s:%s\r\n"
|
||||
"Accept: */*\r\n"
|
||||
"Content-Length: %u\r\n"
|
||||
"Content-Type: multipart/form-data; boundary=%s\r\n"
|
||||
"\r\n",
|
||||
path.str, host.str, port.str,
|
||||
(uint)(2*boundary.length + header.length + data_length + 4),
|
||||
boundary.str + 2);
|
||||
use_proxy() ? "POST http://%s:%s/" : "POST ",
|
||||
host.str, port.str);
|
||||
|
||||
len+= my_snprintf(buf+len, sizeof(buf)-len,
|
||||
"%s HTTP/1.0\r\n"
|
||||
"User-Agent: MariaDB User Feedback Plugin\r\n"
|
||||
"Host: %s:%s\r\n"
|
||||
"Accept: */*\r\n"
|
||||
"Content-Length: %u\r\n"
|
||||
"Content-Type: multipart/form-data; boundary=%s\r\n"
|
||||
"\r\n",
|
||||
path.str, host.str, port.str,
|
||||
(uint)(2*boundary.length + header.length + data_length + 4),
|
||||
boundary.str + 2);
|
||||
|
||||
vio_timeout(vio, FOR_READING, send_timeout);
|
||||
vio_timeout(vio, FOR_WRITING, send_timeout);
|
||||
|
@ -1,6 +1,6 @@
|
||||
/* Copyright (C) 2007 Google Inc.
|
||||
Copyright (c) 2008 MySQL AB, 2008-2009 Sun Microsystems, Inc.
|
||||
Use is subject to license terms.
|
||||
Copyright (c) 2008, 2013, Oracle and/or its affiliates.
|
||||
Copyright (c) 2011, 2016, MariaDB
|
||||
|
||||
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
|
||||
|
@ -537,10 +537,14 @@ static struct st_mysql_show_var audit_status[]=
|
||||
#if defined(HAVE_PSI_INTERFACE) && !defined(FLOGGER_NO_PSI)
|
||||
/* These belong to the service initialization */
|
||||
static PSI_mutex_key key_LOCK_operations;
|
||||
static PSI_mutex_key key_LOCK_bigbuffer;
|
||||
static PSI_mutex_info mutex_key_list[]=
|
||||
{{ &key_LOCK_operations, "SERVER_AUDIT_plugin::lock_operations",
|
||||
{{ &key_LOCK_bigbuffer, "SERVER_AUDIT_plugin::lock_bigbuffer",
|
||||
PSI_FLAG_GLOBAL}};
|
||||
{
|
||||
{ &key_LOCK_operations, "SERVER_AUDIT_plugin::lock_operations",
|
||||
PSI_FLAG_GLOBAL},
|
||||
{ &key_LOCK_bigbuffer, "SERVER_AUDIT_plugin::lock_bigbuffer",
|
||||
PSI_FLAG_GLOBAL}
|
||||
};
|
||||
#endif
|
||||
static mysql_mutex_t lock_operations;
|
||||
static mysql_mutex_t lock_bigbuffer;
|
||||
@ -2845,7 +2849,7 @@ void __attribute__ ((constructor)) audit_plugin_so_init(void)
|
||||
}
|
||||
|
||||
memset(locinfo_ini_value, 'O', sizeof(locinfo_ini_value)-1);
|
||||
locinfo_ini_value[sizeof(locinfo_ini_value)]= 0;
|
||||
locinfo_ini_value[sizeof(locinfo_ini_value)-1]= 0;
|
||||
|
||||
exit:
|
||||
#ifdef _WIN32
|
||||
|
@ -1,5 +1,5 @@
|
||||
/* Copyright (c) 2003, 2014, Oracle and/or its affiliates.
|
||||
Copyright (c) 2009, 2015, MariaDB
|
||||
/* Copyright (c) 2003, 2016, Oracle and/or its affiliates.
|
||||
Copyright (c) 2009, 2016, MariaDB
|
||||
|
||||
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
|
||||
@ -1755,38 +1755,39 @@ mysql_get_ssl_cipher(MYSQL *mysql __attribute__((unused)))
|
||||
static int ssl_verify_server_cert(Vio *vio, const char* server_hostname, const char **errptr)
|
||||
{
|
||||
SSL *ssl;
|
||||
X509 *server_cert;
|
||||
X509_NAME *x509sn;
|
||||
int cn_pos;
|
||||
X509_NAME_ENTRY *cn_entry;
|
||||
ASN1_STRING *cn_asn1;
|
||||
const char *cn_str;
|
||||
X509 *server_cert= NULL;
|
||||
char *cn= NULL;
|
||||
int cn_loc= -1;
|
||||
ASN1_STRING *cn_asn1= NULL;
|
||||
X509_NAME_ENTRY *cn_entry= NULL;
|
||||
X509_NAME *subject= NULL;
|
||||
int ret_validation= 1;
|
||||
|
||||
DBUG_ENTER("ssl_verify_server_cert");
|
||||
DBUG_PRINT("enter", ("server_hostname: %s", server_hostname));
|
||||
|
||||
if (!(ssl= (SSL*)vio->ssl_arg))
|
||||
{
|
||||
*errptr= "No SSL pointer found";
|
||||
DBUG_RETURN(1);
|
||||
goto error;
|
||||
}
|
||||
|
||||
if (!server_hostname)
|
||||
{
|
||||
*errptr= "No server hostname supplied";
|
||||
DBUG_RETURN(1);
|
||||
goto error;
|
||||
}
|
||||
|
||||
if (!(server_cert= SSL_get_peer_certificate(ssl)))
|
||||
{
|
||||
*errptr= "Could not get server certificate";
|
||||
DBUG_RETURN(1);
|
||||
goto error;
|
||||
}
|
||||
|
||||
if (X509_V_OK != SSL_get_verify_result(ssl))
|
||||
{
|
||||
*errptr= "Failed to verify the server certificate";
|
||||
X509_free(server_cert);
|
||||
DBUG_RETURN(1);
|
||||
goto error;
|
||||
}
|
||||
/*
|
||||
We already know that the certificate exchanged was valid; the SSL library
|
||||
@ -1794,33 +1795,57 @@ static int ssl_verify_server_cert(Vio *vio, const char* server_hostname, const c
|
||||
are what we expect.
|
||||
*/
|
||||
|
||||
x509sn= X509_get_subject_name(server_cert);
|
||||
/*
|
||||
Some notes for future development
|
||||
We should check host name in alternative name first and then if needed check in common name.
|
||||
Currently yssl doesn't support alternative name.
|
||||
openssl 1.0.2 support X509_check_host method for host name validation, we may need to start using
|
||||
X509_check_host in the future.
|
||||
*/
|
||||
|
||||
if ((cn_pos= X509_NAME_get_index_by_NID(x509sn, NID_commonName, -1)) < 0)
|
||||
goto err;
|
||||
subject= X509_get_subject_name(server_cert);
|
||||
cn_loc= X509_NAME_get_index_by_NID(subject, NID_commonName, -1);
|
||||
if (cn_loc < 0)
|
||||
{
|
||||
*errptr= "Failed to get CN location in the certificate subject";
|
||||
goto error;
|
||||
}
|
||||
|
||||
if (!(cn_entry= X509_NAME_get_entry(x509sn, cn_pos)))
|
||||
goto err;
|
||||
cn_entry= X509_NAME_get_entry(subject, cn_loc);
|
||||
if (cn_entry == NULL)
|
||||
{
|
||||
*errptr= "Failed to get CN entry using CN location";
|
||||
goto error;
|
||||
}
|
||||
|
||||
if (!(cn_asn1 = X509_NAME_ENTRY_get_data(cn_entry)))
|
||||
goto err;
|
||||
cn_asn1 = X509_NAME_ENTRY_get_data(cn_entry);
|
||||
if (cn_asn1 == NULL)
|
||||
{
|
||||
*errptr= "Failed to get CN from CN entry";
|
||||
goto error;
|
||||
}
|
||||
|
||||
cn_str = (char *)ASN1_STRING_data(cn_asn1);
|
||||
cn= (char *) ASN1_STRING_data(cn_asn1);
|
||||
|
||||
/* Make sure there is no embedded \0 in the CN */
|
||||
if ((size_t)ASN1_STRING_length(cn_asn1) != strlen(cn_str))
|
||||
goto err;
|
||||
if ((size_t)ASN1_STRING_length(cn_asn1) != strlen(cn))
|
||||
{
|
||||
*errptr= "NULL embedded in the certificate CN";
|
||||
goto error;
|
||||
}
|
||||
|
||||
if (strcmp(cn_str, server_hostname))
|
||||
goto err;
|
||||
DBUG_PRINT("info", ("Server hostname in cert: %s", cn));
|
||||
if (!strcmp(cn, server_hostname))
|
||||
{
|
||||
/* Success */
|
||||
ret_validation= 0;
|
||||
}
|
||||
|
||||
X509_free (server_cert);
|
||||
DBUG_RETURN(0);
|
||||
|
||||
err:
|
||||
X509_free(server_cert);
|
||||
*errptr= "SSL certificate validation failure";
|
||||
DBUG_RETURN(1);
|
||||
|
||||
error:
|
||||
if (server_cert != NULL)
|
||||
X509_free (server_cert);
|
||||
DBUG_RETURN(ret_validation);
|
||||
}
|
||||
|
||||
#endif /* HAVE_OPENSSL */
|
||||
|
@ -1,6 +1,5 @@
|
||||
/*
|
||||
Copyright (c) 2000, 2015, Oracle and/or its affiliates.
|
||||
Copyright (c) 2010, 2015, MariaDB
|
||||
/* Copyright (c) 2000, 2016, Oracle and/or its affiliates.
|
||||
Copyright (c) 2010, 2016, MariaDB
|
||||
|
||||
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
|
||||
@ -898,7 +897,12 @@ int field_conv_incompatible(Field *to, Field *from)
|
||||
Field_blob *blob=(Field_blob*) to;
|
||||
from->val_str(&blob->value);
|
||||
|
||||
if (!blob->value.is_alloced() && from->is_updatable())
|
||||
/*
|
||||
Copy value if copy_blobs is set, or source is part of the table's
|
||||
writeset.
|
||||
*/
|
||||
if (to->table->copy_blobs ||
|
||||
(!blob->value.is_alloced() && from->is_updatable()))
|
||||
blob->value.copy();
|
||||
|
||||
return blob->store(blob->value.ptr(),blob->value.length(),from->charset());
|
||||
|
@ -49,14 +49,14 @@ typedef int (*sc_compare_func)(const void*, const void*);
|
||||
static Gcalc_scan_iterator::point *eq_sp(const Gcalc_heap::Info *pi)
|
||||
{
|
||||
GCALC_DBUG_ASSERT(pi->type == Gcalc_heap::nt_eq_node);
|
||||
return (Gcalc_scan_iterator::point *) pi->eq_data;
|
||||
return (Gcalc_scan_iterator::point *) pi->node.eq.data;
|
||||
}
|
||||
|
||||
|
||||
static Gcalc_scan_iterator::intersection_info *i_data(const Gcalc_heap::Info *pi)
|
||||
{
|
||||
GCALC_DBUG_ASSERT(pi->type == Gcalc_heap::nt_intersection);
|
||||
return (Gcalc_scan_iterator::intersection_info *) pi->intersection_data;
|
||||
return (Gcalc_scan_iterator::intersection_info *) pi->node.intersection.data;
|
||||
}
|
||||
|
||||
|
||||
@ -103,8 +103,8 @@ const char *gcalc_ev_name(int ev)
|
||||
static int gcalc_pi_str(char *str, const Gcalc_heap::Info *pi, const char *postfix)
|
||||
{
|
||||
return sprintf(str, "%s %d %d | %s %d %d%s",
|
||||
GCALC_SIGN(pi->ix[0]) ? "-":"", FIRST_DIGIT(pi->ix[0]),pi->ix[1],
|
||||
GCALC_SIGN(pi->iy[0]) ? "-":"", FIRST_DIGIT(pi->iy[0]),pi->iy[1],
|
||||
GCALC_SIGN(pi->node.shape.ix[0]) ? "-":"", FIRST_DIGIT(pi->node.shape.ix[0]),pi->node.shape.ix[1],
|
||||
GCALC_SIGN(pi->node.shape.iy[0]) ? "-":"", FIRST_DIGIT(pi->node.shape.iy[0]),pi->node.shape.iy[1],
|
||||
postfix);
|
||||
|
||||
}
|
||||
@ -594,8 +594,8 @@ void Gcalc_scan_iterator::intersection_info::do_calc_t()
|
||||
Gcalc_coord1 a2_a1x, a2_a1y;
|
||||
Gcalc_coord2 x1y2, x2y1;
|
||||
|
||||
gcalc_sub_coord1(a2_a1x, edge_b->pi->ix, edge_a->pi->ix);
|
||||
gcalc_sub_coord1(a2_a1y, edge_b->pi->iy, edge_a->pi->iy);
|
||||
gcalc_sub_coord1(a2_a1x, edge_b->pi->node.shape.ix, edge_a->pi->node.shape.ix);
|
||||
gcalc_sub_coord1(a2_a1y, edge_b->pi->node.shape.iy, edge_a->pi->node.shape.iy);
|
||||
|
||||
GCALC_DBUG_ASSERT(!gcalc_is_zero(edge_a->dy, GCALC_COORD_BASE) ||
|
||||
!gcalc_is_zero(edge_b->dy, GCALC_COORD_BASE));
|
||||
@ -619,7 +619,7 @@ void Gcalc_scan_iterator::intersection_info::do_calc_y()
|
||||
Gcalc_coord3 a_tb, b_ta;
|
||||
|
||||
gcalc_mul_coord(a_tb, GCALC_COORD_BASE3,
|
||||
t_b, GCALC_COORD_BASE2, edge_a->pi->iy, GCALC_COORD_BASE);
|
||||
t_b, GCALC_COORD_BASE2, edge_a->pi->node.shape.iy, GCALC_COORD_BASE);
|
||||
gcalc_mul_coord(b_ta, GCALC_COORD_BASE3,
|
||||
t_a, GCALC_COORD_BASE2, edge_a->dy, GCALC_COORD_BASE);
|
||||
|
||||
@ -635,7 +635,7 @@ void Gcalc_scan_iterator::intersection_info::do_calc_x()
|
||||
Gcalc_coord3 a_tb, b_ta;
|
||||
|
||||
gcalc_mul_coord(a_tb, GCALC_COORD_BASE3,
|
||||
t_b, GCALC_COORD_BASE2, edge_a->pi->ix, GCALC_COORD_BASE);
|
||||
t_b, GCALC_COORD_BASE2, edge_a->pi->node.shape.ix, GCALC_COORD_BASE);
|
||||
gcalc_mul_coord(b_ta, GCALC_COORD_BASE3,
|
||||
t_a, GCALC_COORD_BASE2, edge_a->dx, GCALC_COORD_BASE);
|
||||
|
||||
@ -656,7 +656,7 @@ static int cmp_node_isc(const Gcalc_heap::Info *node,
|
||||
inf->calc_y_exp();
|
||||
|
||||
gcalc_mul_coord(exp, GCALC_COORD_BASE3,
|
||||
inf->t_b, GCALC_COORD_BASE2, node->iy, GCALC_COORD_BASE);
|
||||
inf->t_b, GCALC_COORD_BASE2, node->node.shape.iy, GCALC_COORD_BASE);
|
||||
|
||||
result= gcalc_cmp_coord(exp, inf->y_exp, GCALC_COORD_BASE3);
|
||||
#ifdef GCALC_CHECK_WITH_FLOAT
|
||||
@ -664,18 +664,18 @@ static int cmp_node_isc(const Gcalc_heap::Info *node,
|
||||
isc->calc_xy_ld(&int_x, &int_y);
|
||||
if (result < 0)
|
||||
{
|
||||
if (!de_check(int_y, node->y) && node->y > int_y)
|
||||
GCALC_DBUG_PRINT(("floatcheck cmp_nod_iscy %g < %LG", node->y, int_y));
|
||||
if (!de_check(int_y, node->node.shape.y) && node->node.shape.y > int_y)
|
||||
GCALC_DBUG_PRINT(("floatcheck cmp_nod_iscy %g < %LG", node->node.shape.y, int_y));
|
||||
}
|
||||
else if (result > 0)
|
||||
{
|
||||
if (!de_check(int_y, node->y) && node->y < int_y)
|
||||
GCALC_DBUG_PRINT(("floatcheck cmp_nod_iscy %g > %LG", node->y, int_y));
|
||||
if (!de_check(int_y, node->node.shape.y) && node->node.shape.y < int_y)
|
||||
GCALC_DBUG_PRINT(("floatcheck cmp_nod_iscy %g > %LG", node->node.shape.y, int_y));
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!de_check(int_y, node->y))
|
||||
GCALC_DBUG_PRINT(("floatcheck cmp_nod_iscy %g == %LG", node->y, int_y));
|
||||
if (!de_check(int_y, node->node.shape.y))
|
||||
GCALC_DBUG_PRINT(("floatcheck cmp_nod_iscy %g == %LG", node->node.shape.y, int_y));
|
||||
}
|
||||
#endif /*GCALC_CHECK_WITH_FLOAT*/
|
||||
if (result)
|
||||
@ -684,27 +684,27 @@ static int cmp_node_isc(const Gcalc_heap::Info *node,
|
||||
|
||||
inf->calc_x_exp();
|
||||
gcalc_mul_coord(exp, GCALC_COORD_BASE3,
|
||||
inf->t_b, GCALC_COORD_BASE2, node->ix, GCALC_COORD_BASE);
|
||||
inf->t_b, GCALC_COORD_BASE2, node->node.shape.ix, GCALC_COORD_BASE);
|
||||
|
||||
result= gcalc_cmp_coord(exp, inf->x_exp, GCALC_COORD_BASE3);
|
||||
#ifdef GCALC_CHECK_WITH_FLOAT
|
||||
if (result < 0)
|
||||
{
|
||||
if (!de_check(int_x, node->x) && node->x > int_x)
|
||||
if (!de_check(int_x, node->node.shape.x) && node->node.shape.x > int_x)
|
||||
GCALC_DBUG_PRINT(("floatcheck cmp_nod_iscx failed %g < %LG",
|
||||
node->x, int_x));
|
||||
node->node.shape.x, int_x));
|
||||
}
|
||||
else if (result > 0)
|
||||
{
|
||||
if (!de_check(int_x, node->x) && node->x < int_x)
|
||||
if (!de_check(int_x, node->node.shape.x) && node->node.shape.x < int_x)
|
||||
GCALC_DBUG_PRINT(("floatcheck cmp_nod_iscx failed %g > %LG",
|
||||
node->x, int_x));
|
||||
node->node.shape.x, int_x));
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!de_check(int_x, node->x))
|
||||
if (!de_check(int_x, node->node.shape.x))
|
||||
GCALC_DBUG_PRINT(("floatcheck cmp_nod_iscx failed %g == %LG",
|
||||
node->x, int_x));
|
||||
node->node.shape.x, int_x));
|
||||
}
|
||||
#endif /*GCALC_CHECK_WITH_FLOAT*/
|
||||
exit:
|
||||
@ -844,13 +844,13 @@ Gcalc_heap::Info *Gcalc_heap::new_point_info(double x, double y,
|
||||
return NULL;
|
||||
*m_hook= result;
|
||||
m_hook= &result->next;
|
||||
result->x= x;
|
||||
result->y= y;
|
||||
result->shape= shape;
|
||||
result->top_node= 1;
|
||||
result->node.shape.x= x;
|
||||
result->node.shape.y= y;
|
||||
result->node.shape.shape= shape;
|
||||
result->node.shape.top_node= 1;
|
||||
result->type= nt_shape_node;
|
||||
gcalc_set_double(result->ix, x, coord_extent);
|
||||
gcalc_set_double(result->iy, y, coord_extent);
|
||||
gcalc_set_double(result->node.shape.ix, x, coord_extent);
|
||||
gcalc_set_double(result->node.shape.iy, y, coord_extent);
|
||||
|
||||
m_n_points++;
|
||||
return result;
|
||||
@ -864,11 +864,11 @@ static Gcalc_heap::Info *new_intersection(
|
||||
if (!isc)
|
||||
return 0;
|
||||
isc->type= Gcalc_heap::nt_intersection;
|
||||
isc->p1= ii->edge_a->pi;
|
||||
isc->p2= ii->edge_a->next_pi;
|
||||
isc->p3= ii->edge_b->pi;
|
||||
isc->p4= ii->edge_b->next_pi;
|
||||
isc->intersection_data= ii;
|
||||
isc->node.intersection.p1= ii->edge_a->pi;
|
||||
isc->node.intersection.p2= ii->edge_a->next_pi;
|
||||
isc->node.intersection.p3= ii->edge_b->pi;
|
||||
isc->node.intersection.p4= ii->edge_b->next_pi;
|
||||
isc->node.intersection.data= ii;
|
||||
return isc;
|
||||
}
|
||||
|
||||
@ -881,46 +881,46 @@ static Gcalc_heap::Info *new_eq_point(
|
||||
if (!eqp)
|
||||
return 0;
|
||||
eqp->type= Gcalc_heap::nt_eq_node;
|
||||
eqp->node= p;
|
||||
eqp->eq_data= edge;
|
||||
eqp->node.eq.node= p;
|
||||
eqp->node.eq.data= edge;
|
||||
return eqp;
|
||||
}
|
||||
|
||||
|
||||
void Gcalc_heap::Info::calc_xy(double *x, double *y) const
|
||||
{
|
||||
double b0_x= p2->x - p1->x;
|
||||
double b0_y= p2->y - p1->y;
|
||||
double b1_x= p4->x - p3->x;
|
||||
double b1_y= p4->y - p3->y;
|
||||
double b0_x= node.intersection.p2->node.shape.x - node.intersection.p1->node.shape.x;
|
||||
double b0_y= node.intersection.p2->node.shape.y - node.intersection.p1->node.shape.y;
|
||||
double b1_x= node.intersection.p4->node.shape.x - node.intersection.p3->node.shape.x;
|
||||
double b1_y= node.intersection.p4->node.shape.y - node.intersection.p3->node.shape.y;
|
||||
double b0xb1= b0_x * b1_y - b0_y * b1_x;
|
||||
double t= (p3->x - p1->x) * b1_y - (p3->y - p1->y) * b1_x;
|
||||
double t= (node.intersection.p3->node.shape.x - node.intersection.p1->node.shape.x) * b1_y - (node.intersection.p3->node.shape.y - node.intersection.p1->node.shape.y) * b1_x;
|
||||
|
||||
t/= b0xb1;
|
||||
|
||||
*x= p1->x + b0_x * t;
|
||||
*y= p1->y + b0_y * t;
|
||||
*x= node.intersection.p1->node.shape.x + b0_x * t;
|
||||
*y= node.intersection.p1->node.shape.y + b0_y * t;
|
||||
}
|
||||
|
||||
|
||||
#ifdef GCALC_CHECK_WITH_FLOAT
|
||||
void Gcalc_heap::Info::calc_xy_ld(long double *x, long double *y) const
|
||||
{
|
||||
long double b0_x= ((long double) p2->x) - p1->x;
|
||||
long double b0_y= ((long double) p2->y) - p1->y;
|
||||
long double b1_x= ((long double) p4->x) - p3->x;
|
||||
long double b1_y= ((long double) p4->y) - p3->y;
|
||||
long double b0_x= ((long double) p2->node.shape.x) - p1->node.shape.x;
|
||||
long double b0_y= ((long double) p2->node.shape.y) - p1->node.shape.y;
|
||||
long double b1_x= ((long double) p4->node.shape.x) - p3->node.shape.x;
|
||||
long double b1_y= ((long double) p4->node.shape.y) - p3->node.shape.y;
|
||||
long double b0xb1= b0_x * b1_y - b0_y * b1_x;
|
||||
long double ax= ((long double) p3->x) - p1->x;
|
||||
long double ay= ((long double) p3->y) - p1->y;
|
||||
long double ax= ((long double) p3->node.shape.x) - p1->node.shape.x;
|
||||
long double ay= ((long double) p3->node.shape.y) - p1->node.shape.y;
|
||||
long double t_a= ax * b1_y - ay * b1_x;
|
||||
long double hx= (b0xb1 * (long double) p1->x + b0_x * t_a);
|
||||
long double hy= (b0xb1 * (long double) p1->y + b0_y * t_a);
|
||||
long double hx= (b0xb1 * (long double) p1->node.shape.x + b0_x * t_a);
|
||||
long double hy= (b0xb1 * (long double) p1->node.shape.y + b0_y * t_a);
|
||||
|
||||
if (fabs(b0xb1) < 1e-15)
|
||||
{
|
||||
*x= p1->x;
|
||||
*y= p1->y;
|
||||
*x= p1->node.shape.x;
|
||||
*y= p1->node.shape.y;
|
||||
return;
|
||||
}
|
||||
|
||||
@ -933,10 +933,10 @@ void Gcalc_heap::Info::calc_xy_ld(long double *x, long double *y) const
|
||||
static int cmp_point_info(const Gcalc_heap::Info *i0,
|
||||
const Gcalc_heap::Info *i1)
|
||||
{
|
||||
int cmp_y= gcalc_cmp_coord1(i0->iy, i1->iy);
|
||||
int cmp_y= gcalc_cmp_coord1(i0->node.shape.iy, i1->node.shape.iy);
|
||||
if (cmp_y)
|
||||
return cmp_y;
|
||||
return gcalc_cmp_coord1(i0->ix, i1->ix);
|
||||
return gcalc_cmp_coord1(i0->node.shape.ix, i1->node.shape.ix);
|
||||
}
|
||||
|
||||
|
||||
@ -944,11 +944,11 @@ static inline void trim_node(Gcalc_heap::Info *node, Gcalc_heap::Info *prev_node
|
||||
{
|
||||
if (!node)
|
||||
return;
|
||||
node->top_node= 0;
|
||||
GCALC_DBUG_ASSERT((node->left == prev_node) || (node->right == prev_node));
|
||||
if (node->left == prev_node)
|
||||
node->left= node->right;
|
||||
node->right= NULL;
|
||||
node->node.shape.top_node= 0;
|
||||
GCALC_DBUG_ASSERT((node->node.shape.left == prev_node) || (node->node.shape.right == prev_node));
|
||||
if (node->node.shape.left == prev_node)
|
||||
node->node.shape.left= node->node.shape.right;
|
||||
node->node.shape.right= NULL;
|
||||
GCALC_DBUG_ASSERT(cmp_point_info(node, prev_node));
|
||||
}
|
||||
|
||||
@ -972,8 +972,8 @@ void Gcalc_heap::prepare_operation()
|
||||
/* TODO - move this to the 'normal_scan' loop */
|
||||
for (cur= get_first(); cur; cur= cur->get_next())
|
||||
{
|
||||
trim_node(cur->left, cur);
|
||||
trim_node(cur->right, cur);
|
||||
trim_node(cur->node.shape.left, cur);
|
||||
trim_node(cur->node.shape.right, cur);
|
||||
}
|
||||
}
|
||||
|
||||
@ -995,7 +995,7 @@ int Gcalc_shape_transporter::int_single_point(gcalc_shape_info Info,
|
||||
Gcalc_heap::Info *point= m_heap->new_point_info(x, y, Info);
|
||||
if (!point)
|
||||
return 1;
|
||||
point->left= point->right= 0;
|
||||
point->node.shape.left= point->node.shape.right= 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -1018,9 +1018,9 @@ int Gcalc_shape_transporter::int_add_point(gcalc_shape_info Info,
|
||||
m_heap->free_point_info(point, hook);
|
||||
return 0;
|
||||
}
|
||||
GCALC_DBUG_ASSERT(!m_prev || m_prev->x != x || m_prev->y != y);
|
||||
m_prev->left= point;
|
||||
point->right= m_prev;
|
||||
GCALC_DBUG_ASSERT(!m_prev || m_prev->node.shape.x != x || m_prev->node.shape.y != y);
|
||||
m_prev->node.shape.left= point;
|
||||
point->node.shape.right= m_prev;
|
||||
}
|
||||
else
|
||||
m_first= point;
|
||||
@ -1040,16 +1040,16 @@ void Gcalc_shape_transporter::int_complete()
|
||||
/* simple point */
|
||||
if (m_first == m_prev)
|
||||
{
|
||||
m_first->right= m_first->left= NULL;
|
||||
m_first->node.shape.right= m_first->node.shape.left= NULL;
|
||||
return;
|
||||
}
|
||||
|
||||
/* line */
|
||||
if (m_shape_started == 1)
|
||||
{
|
||||
m_first->right= NULL;
|
||||
m_prev->left= m_prev->right;
|
||||
m_prev->right= NULL;
|
||||
m_first->node.shape.right= NULL;
|
||||
m_prev->node.shape.left= m_prev->node.shape.right;
|
||||
m_prev->node.shape.right= NULL;
|
||||
return;
|
||||
}
|
||||
|
||||
@ -1057,32 +1057,32 @@ void Gcalc_shape_transporter::int_complete()
|
||||
if (cmp_point_info(m_first, m_prev) == 0)
|
||||
{
|
||||
/* Coinciding points, remove the last one from the list */
|
||||
m_prev->right->left= m_first;
|
||||
m_first->right= m_prev->right;
|
||||
m_prev->node.shape.right->node.shape.left= m_first;
|
||||
m_first->node.shape.right= m_prev->node.shape.right;
|
||||
m_heap->free_point_info(m_prev, m_prev_hook);
|
||||
}
|
||||
else
|
||||
{
|
||||
GCALC_DBUG_ASSERT(m_prev->x != m_first->x || m_prev->y != m_first->y);
|
||||
m_first->right= m_prev;
|
||||
m_prev->left= m_first;
|
||||
GCALC_DBUG_ASSERT(m_prev->node.shape.x != m_first->node.shape.x || m_prev->node.shape.y != m_first->node.shape.y);
|
||||
m_first->node.shape.right= m_prev;
|
||||
m_prev->node.shape.left= m_first;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
inline void calc_dx_dy(Gcalc_scan_iterator::point *p)
|
||||
{
|
||||
gcalc_sub_coord1(p->dx, p->next_pi->ix, p->pi->ix);
|
||||
gcalc_sub_coord1(p->dy, p->next_pi->iy, p->pi->iy);
|
||||
gcalc_sub_coord1(p->dx, p->next_pi->node.shape.ix, p->pi->node.shape.ix);
|
||||
gcalc_sub_coord1(p->dy, p->next_pi->node.shape.iy, p->pi->node.shape.iy);
|
||||
if (GCALC_SIGN(p->dx[0]))
|
||||
{
|
||||
p->l_border= &p->next_pi->ix;
|
||||
p->r_border= &p->pi->ix;
|
||||
p->l_border= &p->next_pi->node.shape.ix;
|
||||
p->r_border= &p->pi->node.shape.ix;
|
||||
}
|
||||
else
|
||||
{
|
||||
p->r_border= &p->next_pi->ix;
|
||||
p->l_border= &p->pi->ix;
|
||||
p->r_border= &p->next_pi->node.shape.ix;
|
||||
p->l_border= &p->pi->node.shape.ix;
|
||||
}
|
||||
}
|
||||
|
||||
@ -1143,10 +1143,10 @@ int Gcalc_scan_iterator::point::cmp_dx_dy(const Gcalc_heap::Info *p1,
|
||||
const Gcalc_heap::Info *p4)
|
||||
{
|
||||
Gcalc_coord1 dx_a, dy_a, dx_b, dy_b;
|
||||
gcalc_sub_coord1(dx_a, p2->ix, p1->ix);
|
||||
gcalc_sub_coord1(dy_a, p2->iy, p1->iy);
|
||||
gcalc_sub_coord1(dx_b, p4->ix, p3->ix);
|
||||
gcalc_sub_coord1(dy_b, p4->iy, p3->iy);
|
||||
gcalc_sub_coord1(dx_a, p2->node.shape.ix, p1->node.shape.ix);
|
||||
gcalc_sub_coord1(dy_a, p2->node.shape.iy, p1->node.shape.iy);
|
||||
gcalc_sub_coord1(dx_b, p4->node.shape.ix, p3->node.shape.ix);
|
||||
gcalc_sub_coord1(dy_b, p4->node.shape.iy, p3->node.shape.iy);
|
||||
return cmp_dx_dy(dx_a, dy_a, dx_b, dy_b);
|
||||
}
|
||||
|
||||
@ -1168,8 +1168,8 @@ void Gcalc_scan_iterator::point::calc_x(long double *x, long double y,
|
||||
*x= ix;
|
||||
}
|
||||
else
|
||||
*x= (ddy * (long double) pi->x + gcalc_get_double(dx, GCALC_COORD_BASE) *
|
||||
(y - pi->y)) / ddy;
|
||||
*x= (ddy * (long double) pi->node.shape.x + gcalc_get_double(dx, GCALC_COORD_BASE) *
|
||||
(y - pi->node.shape.y)) / ddy;
|
||||
}
|
||||
#endif /*GCALC_CHECK_WITH_FLOAT*/
|
||||
|
||||
@ -1280,7 +1280,7 @@ int Gcalc_scan_iterator::arrange_event(int do_sorting, int n_intersections)
|
||||
int Gcalc_heap::Info::equal_pi(const Info *pi) const
|
||||
{
|
||||
if (type == nt_intersection)
|
||||
return equal_intersection;
|
||||
return node.intersection.equal;
|
||||
if (pi->type == nt_eq_node)
|
||||
return 1;
|
||||
if (type == nt_eq_node || pi->type == nt_intersection)
|
||||
@ -1322,7 +1322,7 @@ int Gcalc_scan_iterator::step()
|
||||
#ifndef GCALC_DBUG_OFF
|
||||
if (m_cur_pi->type == Gcalc_heap::nt_intersection &&
|
||||
m_cur_pi->get_next()->type == Gcalc_heap::nt_intersection &&
|
||||
m_cur_pi->equal_intersection)
|
||||
m_cur_pi->node.intersection.equal)
|
||||
GCALC_DBUG_ASSERT(cmp_intersections(m_cur_pi, m_cur_pi->get_next()) == 0);
|
||||
#endif /*GCALC_DBUG_OFF*/
|
||||
GCALC_DBUG_CHECK_COUNTER();
|
||||
@ -1377,23 +1377,23 @@ static int node_on_right(const Gcalc_heap::Info *node,
|
||||
Gcalc_coord2 ax_by, ay_bx;
|
||||
int result;
|
||||
|
||||
gcalc_sub_coord1(a_x, node->ix, edge_a->ix);
|
||||
gcalc_sub_coord1(a_y, node->iy, edge_a->iy);
|
||||
gcalc_sub_coord1(b_x, edge_b->ix, edge_a->ix);
|
||||
gcalc_sub_coord1(b_y, edge_b->iy, edge_a->iy);
|
||||
gcalc_sub_coord1(a_x, node->node.shape.ix, edge_a->node.shape.ix);
|
||||
gcalc_sub_coord1(a_y, node->node.shape.iy, edge_a->node.shape.iy);
|
||||
gcalc_sub_coord1(b_x, edge_b->node.shape.ix, edge_a->node.shape.ix);
|
||||
gcalc_sub_coord1(b_y, edge_b->node.shape.iy, edge_a->node.shape.iy);
|
||||
gcalc_mul_coord1(ax_by, a_x, b_y);
|
||||
gcalc_mul_coord1(ay_bx, a_y, b_x);
|
||||
result= gcalc_cmp_coord(ax_by, ay_bx, GCALC_COORD_BASE2);
|
||||
#ifdef GCALC_CHECK_WITH_FLOAT
|
||||
{
|
||||
long double dx= gcalc_get_double(edge_b->ix, GCALC_COORD_BASE) -
|
||||
gcalc_get_double(edge_a->ix, GCALC_COORD_BASE);
|
||||
long double dy= gcalc_get_double(edge_b->iy, GCALC_COORD_BASE) -
|
||||
gcalc_get_double(edge_a->iy, GCALC_COORD_BASE);
|
||||
long double ax= gcalc_get_double(node->ix, GCALC_COORD_BASE) -
|
||||
gcalc_get_double(edge_a->ix, GCALC_COORD_BASE);
|
||||
long double ay= gcalc_get_double(node->iy, GCALC_COORD_BASE) -
|
||||
gcalc_get_double(edge_a->iy, GCALC_COORD_BASE);
|
||||
long double dx= gcalc_get_double(edge_b->node.shape.ix, GCALC_COORD_BASE) -
|
||||
gcalc_get_double(edge_a->node.shape.ix, GCALC_COORD_BASE);
|
||||
long double dy= gcalc_get_double(edge_b->node.shape.iy, GCALC_COORD_BASE) -
|
||||
gcalc_get_double(edge_a->node.shape.iy, GCALC_COORD_BASE);
|
||||
long double ax= gcalc_get_double(node->node.shape.ix, GCALC_COORD_BASE) -
|
||||
gcalc_get_double(edge_a->node.shape.ix, GCALC_COORD_BASE);
|
||||
long double ay= gcalc_get_double(node->node.shape.iy, GCALC_COORD_BASE) -
|
||||
gcalc_get_double(edge_a->node.shape.iy, GCALC_COORD_BASE);
|
||||
long double d= ax * dy - ay * dx;
|
||||
if (result == 0)
|
||||
GCALC_DBUG_ASSERT(de_check(d, 0.0));
|
||||
@ -1412,8 +1412,8 @@ static int cmp_tops(const Gcalc_heap::Info *top_node,
|
||||
{
|
||||
int cmp_res_a, cmp_res_b;
|
||||
|
||||
cmp_res_a= gcalc_cmp_coord1(edge_a->ix, top_node->ix);
|
||||
cmp_res_b= gcalc_cmp_coord1(edge_b->ix, top_node->ix);
|
||||
cmp_res_a= gcalc_cmp_coord1(edge_a->node.shape.ix, top_node->node.shape.ix);
|
||||
cmp_res_b= gcalc_cmp_coord1(edge_b->node.shape.ix, top_node->node.shape.ix);
|
||||
|
||||
if (cmp_res_a <= 0 && cmp_res_b > 0)
|
||||
return -1;
|
||||
@ -1438,26 +1438,26 @@ int Gcalc_scan_iterator::insert_top_node()
|
||||
if (!sp0)
|
||||
GCALC_DBUG_RETURN(1);
|
||||
sp0->pi= m_cur_pi;
|
||||
sp0->next_pi= m_cur_pi->left;
|
||||
sp0->next_pi= m_cur_pi->node.shape.left;
|
||||
#ifndef GCALC_DBUG_OFF
|
||||
sp0->thread= m_cur_thread++;
|
||||
#endif /*GCALC_DBUG_OFF*/
|
||||
if (m_cur_pi->left)
|
||||
if (m_cur_pi->node.shape.left)
|
||||
{
|
||||
calc_dx_dy(sp0);
|
||||
if (m_cur_pi->right)
|
||||
if (m_cur_pi->node.shape.right)
|
||||
{
|
||||
if (!(sp1= new_slice_point()))
|
||||
GCALC_DBUG_RETURN(1);
|
||||
sp1->event= sp0->event= scev_two_threads;
|
||||
sp1->pi= m_cur_pi;
|
||||
sp1->next_pi= m_cur_pi->right;
|
||||
sp1->next_pi= m_cur_pi->node.shape.right;
|
||||
#ifndef GCALC_DBUG_OFF
|
||||
sp1->thread= m_cur_thread++;
|
||||
#endif /*GCALC_DBUG_OFF*/
|
||||
calc_dx_dy(sp1);
|
||||
/* We have two threads so should decide which one will be first */
|
||||
cmp_res= cmp_tops(m_cur_pi, m_cur_pi->left, m_cur_pi->right);
|
||||
cmp_res= cmp_tops(m_cur_pi, m_cur_pi->node.shape.left, m_cur_pi->node.shape.right);
|
||||
if (cmp_res > 0)
|
||||
{
|
||||
point *tmp= sp0;
|
||||
@ -1467,7 +1467,7 @@ int Gcalc_scan_iterator::insert_top_node()
|
||||
else if (cmp_res == 0)
|
||||
{
|
||||
/* Exactly same direction of the edges. */
|
||||
cmp_res= gcalc_cmp_coord1(m_cur_pi->left->iy, m_cur_pi->right->iy);
|
||||
cmp_res= gcalc_cmp_coord1(m_cur_pi->node.shape.left->node.shape.iy, m_cur_pi->node.shape.right->node.shape.iy);
|
||||
if (cmp_res != 0)
|
||||
{
|
||||
if (cmp_res < 0)
|
||||
@ -1483,7 +1483,7 @@ int Gcalc_scan_iterator::insert_top_node()
|
||||
}
|
||||
else
|
||||
{
|
||||
cmp_res= gcalc_cmp_coord1(m_cur_pi->left->ix, m_cur_pi->right->ix);
|
||||
cmp_res= gcalc_cmp_coord1(m_cur_pi->node.shape.left->node.shape.ix, m_cur_pi->node.shape.right->node.shape.ix);
|
||||
if (cmp_res != 0)
|
||||
{
|
||||
if (cmp_res < 0)
|
||||
@ -1517,7 +1517,7 @@ int Gcalc_scan_iterator::insert_top_node()
|
||||
/* We need to find the place to insert. */
|
||||
for (; sp; prev_hook= sp->next_ptr(), sp=sp->get_next())
|
||||
{
|
||||
if (sp->event || gcalc_cmp_coord1(*sp->r_border, m_cur_pi->ix) < 0)
|
||||
if (sp->event || gcalc_cmp_coord1(*sp->r_border, m_cur_pi->node.shape.ix) < 0)
|
||||
continue;
|
||||
cmp_res= node_on_right(m_cur_pi, sp->pi, sp->next_pi);
|
||||
if (cmp_res == 0)
|
||||
@ -1743,7 +1743,7 @@ int Gcalc_scan_iterator::node_scan()
|
||||
GCALC_DBUG_PRINT(("node for %d", sp->thread));
|
||||
/* Handle the point itself. */
|
||||
sp->pi= cur_pi;
|
||||
sp->next_pi= cur_pi->left;
|
||||
sp->next_pi= cur_pi->node.shape.left;
|
||||
sp->event= scev_point;
|
||||
calc_dx_dy(sp);
|
||||
|
||||
@ -1794,7 +1794,7 @@ void Gcalc_scan_iterator::intersection_scan()
|
||||
ii->edge_a->event= ii->edge_b->event= scev_intersection;
|
||||
ii->edge_a->ev_pi= ii->edge_b->ev_pi= m_cur_pi;
|
||||
free_item(ii);
|
||||
m_cur_pi->intersection_data= NULL;
|
||||
m_cur_pi->node.intersection.data= NULL;
|
||||
|
||||
GCALC_DBUG_VOID_RETURN;
|
||||
}
|
||||
@ -1813,7 +1813,7 @@ int Gcalc_scan_iterator::add_intersection(point *sp_a, point *sp_b,
|
||||
!(ii= new_intersection(m_heap, i_calc)))
|
||||
GCALC_DBUG_RETURN(1);
|
||||
|
||||
ii->equal_intersection= 0;
|
||||
ii->node.intersection.equal= 0;
|
||||
|
||||
for (;
|
||||
pi_from->get_next() != sp_a->next_pi &&
|
||||
@ -1824,7 +1824,7 @@ int Gcalc_scan_iterator::add_intersection(point *sp_a, point *sp_b,
|
||||
if (skip_next)
|
||||
{
|
||||
if (cur->type == Gcalc_heap::nt_intersection)
|
||||
skip_next= cur->equal_intersection;
|
||||
skip_next= cur->node.intersection.equal;
|
||||
else
|
||||
skip_next= 0;
|
||||
continue;
|
||||
@ -1832,7 +1832,7 @@ int Gcalc_scan_iterator::add_intersection(point *sp_a, point *sp_b,
|
||||
if (cur->type == Gcalc_heap::nt_intersection)
|
||||
{
|
||||
cmp_res= cmp_intersections(cur, ii);
|
||||
skip_next= cur->equal_intersection;
|
||||
skip_next= cur->node.intersection.equal;
|
||||
}
|
||||
else if (cur->type == Gcalc_heap::nt_eq_node)
|
||||
continue;
|
||||
@ -1840,7 +1840,7 @@ int Gcalc_scan_iterator::add_intersection(point *sp_a, point *sp_b,
|
||||
cmp_res= cmp_node_isc(cur, ii);
|
||||
if (cmp_res == 0)
|
||||
{
|
||||
ii->equal_intersection= 1;
|
||||
ii->node.intersection.equal= 1;
|
||||
break;
|
||||
}
|
||||
else if (cmp_res > 0)
|
||||
@ -1881,13 +1881,13 @@ void calc_t(Gcalc_coord2 t_a, Gcalc_coord2 t_b,
|
||||
Gcalc_coord2 x1y2, x2y1;
|
||||
Gcalc_coord1 dya, dyb;
|
||||
|
||||
gcalc_sub_coord1(a2_a1x, p3->ix, p1->ix);
|
||||
gcalc_sub_coord1(a2_a1y, p3->iy, p1->iy);
|
||||
gcalc_sub_coord1(a2_a1x, p3->node.shape.ix, p1->node.shape.ix);
|
||||
gcalc_sub_coord1(a2_a1y, p3->node.shape.iy, p1->node.shape.iy);
|
||||
|
||||
gcalc_sub_coord1(dxa, p2->ix, p1->ix);
|
||||
gcalc_sub_coord1(dya, p2->iy, p1->iy);
|
||||
gcalc_sub_coord1(dxb, p4->ix, p3->ix);
|
||||
gcalc_sub_coord1(dyb, p4->iy, p3->iy);
|
||||
gcalc_sub_coord1(dxa, p2->node.shape.ix, p1->node.shape.ix);
|
||||
gcalc_sub_coord1(dya, p2->node.shape.iy, p1->node.shape.iy);
|
||||
gcalc_sub_coord1(dxb, p4->node.shape.ix, p3->node.shape.ix);
|
||||
gcalc_sub_coord1(dyb, p4->node.shape.iy, p3->node.shape.iy);
|
||||
|
||||
gcalc_mul_coord1(x1y2, dxa, dyb);
|
||||
gcalc_mul_coord1(x2y1, dya, dxb);
|
||||
@ -1908,11 +1908,11 @@ double Gcalc_scan_iterator::get_y() const
|
||||
Gcalc_coord2 t_a, t_b;
|
||||
Gcalc_coord3 a_tb, b_ta, y_exp;
|
||||
calc_t(t_a, t_b, dxa, dya,
|
||||
state.pi->p1, state.pi->p2, state.pi->p3, state.pi->p4);
|
||||
state.pi->node.intersection.p1, state.pi->node.intersection.p2, state.pi->node.intersection.p3, state.pi->node.intersection.p4);
|
||||
|
||||
|
||||
gcalc_mul_coord(a_tb, GCALC_COORD_BASE3,
|
||||
t_b, GCALC_COORD_BASE2, state.pi->p1->iy, GCALC_COORD_BASE);
|
||||
t_b, GCALC_COORD_BASE2, state.pi->node.intersection.p1->node.shape.iy, GCALC_COORD_BASE);
|
||||
gcalc_mul_coord(b_ta, GCALC_COORD_BASE3,
|
||||
t_a, GCALC_COORD_BASE2, dya, GCALC_COORD_BASE);
|
||||
|
||||
@ -1922,7 +1922,7 @@ double Gcalc_scan_iterator::get_y() const
|
||||
get_pure_double(t_b, GCALC_COORD_BASE2)) / m_heap->coord_extent;
|
||||
}
|
||||
else
|
||||
return state.pi->y;
|
||||
return state.pi->node.shape.y;
|
||||
}
|
||||
|
||||
|
||||
@ -1934,11 +1934,11 @@ double Gcalc_scan_iterator::get_event_x() const
|
||||
Gcalc_coord2 t_a, t_b;
|
||||
Gcalc_coord3 a_tb, b_ta, x_exp;
|
||||
calc_t(t_a, t_b, dxa, dya,
|
||||
state.pi->p1, state.pi->p2, state.pi->p3, state.pi->p4);
|
||||
state.pi->node.intersection.p1, state.pi->node.intersection.p2, state.pi->node.intersection.p3, state.pi->node.intersection.p4);
|
||||
|
||||
|
||||
gcalc_mul_coord(a_tb, GCALC_COORD_BASE3,
|
||||
t_b, GCALC_COORD_BASE2, state.pi->p1->ix, GCALC_COORD_BASE);
|
||||
t_b, GCALC_COORD_BASE2, state.pi->node.intersection.p1->node.shape.ix, GCALC_COORD_BASE);
|
||||
gcalc_mul_coord(b_ta, GCALC_COORD_BASE3,
|
||||
t_a, GCALC_COORD_BASE2, dxa, GCALC_COORD_BASE);
|
||||
|
||||
@ -1948,7 +1948,7 @@ double Gcalc_scan_iterator::get_event_x() const
|
||||
get_pure_double(t_b, GCALC_COORD_BASE2)) / m_heap->coord_extent;
|
||||
}
|
||||
else
|
||||
return state.pi->x;
|
||||
return state.pi->node.shape.x;
|
||||
}
|
||||
|
||||
double Gcalc_scan_iterator::get_h() const
|
||||
@ -1961,7 +1961,7 @@ double Gcalc_scan_iterator::get_h() const
|
||||
state.pi->calc_xy(&x, &next_y);
|
||||
}
|
||||
else
|
||||
next_y= state.pi->y;
|
||||
next_y= state.pi->node.shape.y;
|
||||
return next_y - cur_y;
|
||||
}
|
||||
|
||||
@ -1970,11 +1970,11 @@ double Gcalc_scan_iterator::get_sp_x(const point *sp) const
|
||||
{
|
||||
double dy;
|
||||
if (sp->event & (scev_end | scev_two_ends | scev_point))
|
||||
return sp->pi->x;
|
||||
dy= sp->next_pi->y - sp->pi->y;
|
||||
return sp->pi->node.shape.x;
|
||||
dy= sp->next_pi->node.shape.y - sp->pi->node.shape.y;
|
||||
if (fabs(dy) < 1e-12)
|
||||
return sp->pi->x;
|
||||
return (sp->next_pi->x - sp->pi->x) * dy;
|
||||
return sp->pi->node.shape.x;
|
||||
return (sp->next_pi->node.shape.x - sp->pi->node.shape.x) * dy;
|
||||
}
|
||||
|
||||
|
||||
|
@ -188,7 +188,7 @@ public:
|
||||
double x,y;
|
||||
Gcalc_coord1 ix, iy;
|
||||
int top_node;
|
||||
};
|
||||
} shape;
|
||||
struct
|
||||
{
|
||||
/* nt_intersection */
|
||||
@ -197,21 +197,21 @@ public:
|
||||
const Info *p2;
|
||||
const Info *p3;
|
||||
const Info *p4;
|
||||
void *intersection_data;
|
||||
int equal_intersection;
|
||||
};
|
||||
void *data;
|
||||
int equal;
|
||||
} intersection;
|
||||
struct
|
||||
{
|
||||
/* nt_eq_node */
|
||||
const Info *node;
|
||||
void *eq_data;
|
||||
};
|
||||
};
|
||||
void *data;
|
||||
} eq;
|
||||
} node;
|
||||
|
||||
bool is_bottom() const
|
||||
{ GCALC_DBUG_ASSERT(type == nt_shape_node); return !left; }
|
||||
{ GCALC_DBUG_ASSERT(type == nt_shape_node); return !node.shape.left; }
|
||||
bool is_top() const
|
||||
{ GCALC_DBUG_ASSERT(type == nt_shape_node); return top_node; }
|
||||
{ GCALC_DBUG_ASSERT(type == nt_shape_node); return node.shape.top_node; }
|
||||
bool is_single_node() const
|
||||
{ return is_bottom() && is_top(); }
|
||||
|
||||
@ -383,7 +383,7 @@ public:
|
||||
inline const point *c_get_next() const
|
||||
{ return (const point *)next; }
|
||||
inline bool is_bottom() const { return !next_pi; }
|
||||
gcalc_shape_info get_shape() const { return pi->shape; }
|
||||
gcalc_shape_info get_shape() const { return pi->node.shape.shape; }
|
||||
inline point *get_next() { return (point *)next; }
|
||||
inline const point *get_next() const { return (const point *)next; }
|
||||
/* Compare the dx_dy parameters regarding the horiz_dir */
|
||||
|
@ -1243,7 +1243,7 @@ inline int Gcalc_operation_reducer::get_single_result(res_point *res,
|
||||
GCALC_DBUG_RETURN(1);
|
||||
}
|
||||
else
|
||||
if (storage->single_point(res->pi->x, res->pi->y))
|
||||
if (storage->single_point(res->pi->node.shape.x, res->pi->node.shape.y))
|
||||
GCALC_DBUG_RETURN(1);
|
||||
free_result(res);
|
||||
GCALC_DBUG_RETURN(0);
|
||||
@ -1269,8 +1269,8 @@ int Gcalc_operation_reducer::get_result_thread(res_point *cur,
|
||||
}
|
||||
else
|
||||
{
|
||||
x= cur->pi->x;
|
||||
y= cur->pi->y;
|
||||
x= cur->pi->node.shape.x;
|
||||
y= cur->pi->node.shape.y;
|
||||
}
|
||||
if (storage->add_point(x, y))
|
||||
GCALC_DBUG_RETURN(1);
|
||||
|
@ -1,6 +1,6 @@
|
||||
/*
|
||||
Copyright (c) 2000, 2014, Oracle and/or its affiliates.
|
||||
Copyright (c) 2010, 2015, MariaDB
|
||||
Copyright (c) 2010, 2016, MariaDB
|
||||
|
||||
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
|
||||
|
@ -2,7 +2,7 @@
|
||||
#define SQL_ITEM_INCLUDED
|
||||
|
||||
/* Copyright (c) 2000, 2015, Oracle and/or its affiliates.
|
||||
Copyright (c) 2009, 2015, MariaDB
|
||||
Copyright (c) 2009, 2016, MariaDB
|
||||
|
||||
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
|
||||
|
@ -1,5 +1,5 @@
|
||||
/* Copyright (c) 2000, 2013, Oracle and/or its affiliates.
|
||||
Copyright (c) 2009, 2015, MariaDB
|
||||
Copyright (c) 2009, 2016, MariaDB
|
||||
|
||||
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
|
||||
|
@ -1,7 +1,7 @@
|
||||
#ifndef ITEM_CMPFUNC_INCLUDED
|
||||
#define ITEM_CMPFUNC_INCLUDED
|
||||
/* Copyright (c) 2000, 2015, Oracle and/or its affiliates.
|
||||
Copyright (c) 2009, 2015, MariaDB
|
||||
Copyright (c) 2009, 2016, MariaDB
|
||||
|
||||
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
|
||||
|
@ -637,10 +637,10 @@ static double count_edge_t(const Gcalc_heap::Info *ea,
|
||||
double &ex, double &ey, double &vx, double &vy,
|
||||
double &e_sqrlen)
|
||||
{
|
||||
ex= eb->x - ea->x;
|
||||
ey= eb->y - ea->y;
|
||||
vx= v->x - ea->x;
|
||||
vy= v->y - ea->y;
|
||||
ex= eb->node.shape.x - ea->node.shape.x;
|
||||
ey= eb->node.shape.y - ea->node.shape.y;
|
||||
vx= v->node.shape.x - ea->node.shape.x;
|
||||
vy= v->node.shape.y - ea->node.shape.y;
|
||||
e_sqrlen= ex * ex + ey * ey;
|
||||
return (ex * vx + ey * vy) / e_sqrlen;
|
||||
}
|
||||
@ -656,8 +656,8 @@ static double distance_to_line(double ex, double ey, double vx, double vy,
|
||||
static double distance_points(const Gcalc_heap::Info *a,
|
||||
const Gcalc_heap::Info *b)
|
||||
{
|
||||
double x= a->x - b->x;
|
||||
double y= a->y - b->y;
|
||||
double x= a->node.shape.x - b->node.shape.x;
|
||||
double y= a->node.shape.y - b->node.shape.y;
|
||||
return sqrt(x * x + y * y);
|
||||
}
|
||||
|
||||
@ -1698,7 +1698,7 @@ double Item_func_distance::val_real()
|
||||
continue;
|
||||
|
||||
count_distance:
|
||||
if (cur_point->shape >= obj2_si)
|
||||
if (cur_point->node.shape.shape >= obj2_si)
|
||||
continue;
|
||||
cur_point_edge= !cur_point->is_bottom();
|
||||
|
||||
@ -1706,13 +1706,13 @@ count_distance:
|
||||
{
|
||||
/* We only check vertices of object 2 */
|
||||
if (dist_point->type != Gcalc_heap::nt_shape_node ||
|
||||
dist_point->shape < obj2_si)
|
||||
dist_point->node.shape.shape < obj2_si)
|
||||
continue;
|
||||
|
||||
/* if we have an edge to check */
|
||||
if (dist_point->left)
|
||||
if (dist_point->node.shape.left)
|
||||
{
|
||||
t= count_edge_t(dist_point, dist_point->left, cur_point,
|
||||
t= count_edge_t(dist_point, dist_point->node.shape.left, cur_point,
|
||||
ex, ey, vx, vy, e_sqrlen);
|
||||
if ((t>0.0) && (t<1.0))
|
||||
{
|
||||
@ -1723,7 +1723,7 @@ count_distance:
|
||||
}
|
||||
if (cur_point_edge)
|
||||
{
|
||||
t= count_edge_t(cur_point, cur_point->left, dist_point,
|
||||
t= count_edge_t(cur_point, cur_point->node.shape.left, dist_point,
|
||||
ex, ey, vx, vy, e_sqrlen);
|
||||
if ((t>0.0) && (t<1.0))
|
||||
{
|
||||
|
@ -1557,7 +1557,7 @@ String *Item_func_insert::val_str(String *str)
|
||||
length= res->charpos((int) length, (uint32) start);
|
||||
|
||||
/* Re-testing with corrected params */
|
||||
if (start > res->length())
|
||||
if (start + 1 > res->length()) // remember, start = args[1].val_int() - 1
|
||||
return res; /* purecov: inspected */ // Wrong param; skip insert
|
||||
if (length > res->length() - start)
|
||||
length= res->length() - start;
|
||||
|
@ -1,6 +1,6 @@
|
||||
/*
|
||||
Copyright (c) 2000, 2012, Oracle and/or its affiliates.
|
||||
Copyright (c) 2009, 2013, Monty Program Ab
|
||||
Copyright (c) 2009, 2016, MariaDB
|
||||
|
||||
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
|
||||
@ -3000,7 +3000,7 @@ void Item_func_timestamp_diff::print(String *str, enum_query_type query_type)
|
||||
str->append(STRING_WITH_LEN("SECOND"));
|
||||
break;
|
||||
case INTERVAL_MICROSECOND:
|
||||
str->append(STRING_WITH_LEN("SECOND_FRAC"));
|
||||
str->append(STRING_WITH_LEN("MICROSECOND"));
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
@ -1,5 +1,5 @@
|
||||
/* Copyright (c) 2000, 2013, Oracle and/or its affiliates.
|
||||
Copyright (c) 2009, 2015, MariaDB
|
||||
Copyright (c) 2009, 2016, MariaDB
|
||||
|
||||
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
|
||||
|
@ -1,6 +1,6 @@
|
||||
/*
|
||||
Copyright (c) 2000, 2014, Oracle and/or its affiliates.
|
||||
Copyright (c) 2009, 2014, Monty Program Ab.
|
||||
Copyright (c) 2000, 2015, Oracle and/or its affiliates.
|
||||
Copyright (c) 2009, 2016, MariaDB
|
||||
|
||||
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
|
||||
@ -3409,7 +3409,7 @@ Query_log_event::Query_log_event(const char* buf, uint event_len,
|
||||
|
||||
slave_proxy_id= thread_id = uint4korr(buf + Q_THREAD_ID_OFFSET);
|
||||
exec_time = uint4korr(buf + Q_EXEC_TIME_OFFSET);
|
||||
db_len = (uint)buf[Q_DB_LEN_OFFSET]; // TODO: add a check of all *_len vars
|
||||
db_len = (uchar)buf[Q_DB_LEN_OFFSET]; // TODO: add a check of all *_len vars
|
||||
error_code = uint2korr(buf + Q_ERR_CODE_OFFSET);
|
||||
|
||||
/*
|
||||
@ -11049,8 +11049,8 @@ bool Table_map_log_event::write_data_body(IO_CACHE *file)
|
||||
DBUG_ASSERT(m_dbnam != NULL);
|
||||
DBUG_ASSERT(m_tblnam != NULL);
|
||||
/* We use only one byte per length for storage in event: */
|
||||
DBUG_ASSERT(m_dblen < 128);
|
||||
DBUG_ASSERT(m_tbllen < 128);
|
||||
DBUG_ASSERT(m_dblen <= MY_MIN(NAME_LEN, 255));
|
||||
DBUG_ASSERT(m_tbllen <= MY_MIN(NAME_LEN, 255));
|
||||
|
||||
uchar const dbuf[]= { (uchar) m_dblen };
|
||||
uchar const tbuf[]= { (uchar) m_tbllen };
|
||||
|
@ -1,5 +1,5 @@
|
||||
/* Copyright (c) 2000, 2015, Oracle and/or its affiliates.
|
||||
Copyright (c) 2008, 2015, MariaDB
|
||||
Copyright (c) 2008, 2016, MariaDB
|
||||
|
||||
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
|
||||
@ -1447,7 +1447,6 @@ static openssl_lock_t *openssl_dynlock_create(const char *, int);
|
||||
static void openssl_dynlock_destroy(openssl_lock_t *, const char *, int);
|
||||
static void openssl_lock_function(int, int, const char *, int);
|
||||
static void openssl_lock(int, openssl_lock_t *, const char *, int);
|
||||
static unsigned long openssl_id_function();
|
||||
#endif
|
||||
char *des_key_file;
|
||||
#ifndef EMBEDDED_LIBRARY
|
||||
@ -4460,7 +4459,6 @@ static int init_thread_environment()
|
||||
CRYPTO_set_dynlock_destroy_callback(openssl_dynlock_destroy);
|
||||
CRYPTO_set_dynlock_lock_callback(openssl_lock);
|
||||
CRYPTO_set_locking_callback(openssl_lock_function);
|
||||
CRYPTO_set_id_callback(openssl_id_function);
|
||||
#endif
|
||||
#endif
|
||||
mysql_rwlock_init(key_rwlock_LOCK_sys_init_connect, &LOCK_sys_init_connect);
|
||||
@ -4496,12 +4494,6 @@ static int init_thread_environment()
|
||||
|
||||
|
||||
#if defined(HAVE_OPENSSL) && !defined(HAVE_YASSL)
|
||||
static unsigned long openssl_id_function()
|
||||
{
|
||||
return (unsigned long) pthread_self();
|
||||
}
|
||||
|
||||
|
||||
static openssl_lock_t *openssl_dynlock_create(const char *file, int line)
|
||||
{
|
||||
openssl_lock_t *lock= new openssl_lock_t;
|
||||
@ -8265,7 +8257,7 @@ static int mysql_init_variables(void)
|
||||
my_atomic_rwlock_init(&thread_count_lock);
|
||||
my_atomic_rwlock_init(&statistics_lock);
|
||||
my_atomic_rwlock_init(&slave_executed_entries_lock);
|
||||
strmov(server_version, MYSQL_SERVER_VERSION);
|
||||
strnmov(server_version, MYSQL_SERVER_VERSION, sizeof(server_version)-1);
|
||||
threads.empty();
|
||||
thread_cache.empty();
|
||||
key_caches.empty();
|
||||
@ -9097,17 +9089,20 @@ static int get_options(int *argc_ptr, char ***argv_ptr)
|
||||
|
||||
void set_server_version(void)
|
||||
{
|
||||
char *end= strxmov(server_version, MYSQL_SERVER_VERSION,
|
||||
MYSQL_SERVER_SUFFIX_STR, NullS);
|
||||
char *version_end= server_version+sizeof(server_version)-1;
|
||||
char *end= strxnmov(server_version, sizeof(server_version)-1,
|
||||
MYSQL_SERVER_VERSION,
|
||||
MYSQL_SERVER_SUFFIX_STR, NullS);
|
||||
#ifdef EMBEDDED_LIBRARY
|
||||
end= strmov(end, "-embedded");
|
||||
end= strnmov(end, "-embedded", (version_end-end));
|
||||
#endif
|
||||
#ifndef DBUG_OFF
|
||||
if (!strstr(MYSQL_SERVER_SUFFIX_STR, "-debug"))
|
||||
end= strmov(end, "-debug");
|
||||
end= strnmov(end, "-debug", (version_end-end));
|
||||
#endif
|
||||
if (opt_log || opt_slow_log || opt_bin_log)
|
||||
strmov(end, "-log"); // This may slow down system
|
||||
strnmov(end, "-log", (version_end-end)); // This may slow down system
|
||||
*end= 0;
|
||||
}
|
||||
|
||||
|
||||
|
@ -831,12 +831,14 @@ bool subquery_types_allow_materialization(Item_in_subselect *in_subs)
|
||||
in_subs->sjm_scan_allowed= FALSE;
|
||||
|
||||
bool all_are_fields= TRUE;
|
||||
uint32 total_key_length = 0;
|
||||
for (uint i= 0; i < elements; i++)
|
||||
{
|
||||
Item *outer= in_subs->left_expr->element_index(i);
|
||||
Item *inner= it++;
|
||||
all_are_fields &= (outer->real_item()->type() == Item::FIELD_ITEM &&
|
||||
inner->real_item()->type() == Item::FIELD_ITEM);
|
||||
total_key_length += inner->max_length;
|
||||
if (outer->cmp_type() != inner->cmp_type())
|
||||
DBUG_RETURN(FALSE);
|
||||
switch (outer->cmp_type()) {
|
||||
@ -867,6 +869,15 @@ bool subquery_types_allow_materialization(Item_in_subselect *in_subs)
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
Make sure that create_tmp_table will not fail due to too long keys.
|
||||
See MDEV-7122. This check is performed inside create_tmp_table also and
|
||||
we must do it so that we know the table has keys created.
|
||||
*/
|
||||
if (total_key_length > tmp_table_max_key_length() ||
|
||||
elements > tmp_table_max_key_parts())
|
||||
DBUG_RETURN(FALSE);
|
||||
|
||||
in_subs->types_allow_materialization= TRUE;
|
||||
in_subs->sjm_scan_allowed= all_are_fields;
|
||||
DBUG_PRINT("info",("subquery_types_allow_materialization: ok, allowed"));
|
||||
@ -5519,7 +5530,8 @@ bool JOIN::choose_subquery_plan(table_map join_tables)
|
||||
outer join has not been optimized yet).
|
||||
*/
|
||||
if (outer_join && outer_join->table_count > 0 && // (1)
|
||||
outer_join->join_tab) // (2)
|
||||
outer_join->join_tab && // (2)
|
||||
!in_subs->const_item())
|
||||
{
|
||||
/*
|
||||
TODO:
|
||||
|
@ -59,6 +59,7 @@ Slave_reporting_capability::report(loglevel level, int err_code,
|
||||
report_function= sql_print_information;
|
||||
break;
|
||||
default:
|
||||
va_end(args);
|
||||
DBUG_ASSERT(0); // should not come here
|
||||
return; // don't crash production builds, just do nothing
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
/* Copyright (c) 2010, 2014, Oracle and/or its affiliates.
|
||||
Copyright (c) 2012, 2015, MariaDB
|
||||
/* Copyright (c) 2010, 2015, Oracle and/or its affiliates.
|
||||
Copyright (c) 2011, 2016, MariaDB
|
||||
|
||||
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
|
||||
@ -288,7 +288,8 @@ static inline bool table_not_corrupt_error(uint sql_errno)
|
||||
sql_errno == ER_LOCK_WAIT_TIMEOUT ||
|
||||
sql_errno == ER_LOCK_DEADLOCK ||
|
||||
sql_errno == ER_CANT_LOCK_LOG_TABLE ||
|
||||
sql_errno == ER_OPEN_AS_READONLY);
|
||||
sql_errno == ER_OPEN_AS_READONLY ||
|
||||
sql_errno == ER_WRONG_OBJECT);
|
||||
}
|
||||
|
||||
|
||||
@ -393,7 +394,13 @@ static bool mysql_admin_table(THD* thd, TABLE_LIST* tables,
|
||||
lex->query_tables_last= &table->next_global;
|
||||
lex->query_tables_own_last= 0;
|
||||
|
||||
if (view_operator_func == NULL)
|
||||
/*
|
||||
CHECK TABLE command is allowed for views as well. Check on alter flags
|
||||
to differentiate from ALTER TABLE...CHECK PARTITION on which view is not
|
||||
allowed.
|
||||
*/
|
||||
if (lex->alter_info.flags & Alter_info::ALTER_ADMIN_PARTITION ||
|
||||
view_operator_func == NULL)
|
||||
{
|
||||
table->required_type=FRMTYPE_TABLE;
|
||||
DBUG_ASSERT(!lex->only_view);
|
||||
|
168
sql/sql_base.cc
168
sql/sql_base.cc
@ -1,5 +1,5 @@
|
||||
/* Copyright (c) 2000, 2015, Oracle and/or its affiliates.
|
||||
Copyright (c) 2010, 2015, MariaDB
|
||||
Copyright (c) 2010, 2016, MariaDB
|
||||
|
||||
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
|
||||
@ -168,11 +168,6 @@ static bool check_and_update_table_version(THD *thd, TABLE_LIST *tables,
|
||||
TABLE_SHARE *table_share);
|
||||
static bool open_table_entry_fini(THD *thd, TABLE_SHARE *share, TABLE *entry);
|
||||
static bool auto_repair_table(THD *thd, TABLE_LIST *table_list);
|
||||
static bool
|
||||
has_write_table_with_auto_increment(TABLE_LIST *tables);
|
||||
static bool
|
||||
has_write_table_with_auto_increment_and_select(TABLE_LIST *tables);
|
||||
static bool has_write_table_auto_increment_not_first_in_pk(TABLE_LIST *tables);
|
||||
|
||||
|
||||
/**
|
||||
@ -2254,6 +2249,16 @@ bool open_table(THD *thd, TABLE_LIST *table_list, MEM_ROOT *mem_root,
|
||||
*/
|
||||
if (dd_frm_is_view(thd, path))
|
||||
{
|
||||
/*
|
||||
If parent_l of the table_list is non null then a merge table
|
||||
has this view as child table, which is not supported.
|
||||
*/
|
||||
if (table_list->parent_l)
|
||||
{
|
||||
my_error(ER_WRONG_MRG_TABLE, MYF(0));
|
||||
DBUG_RETURN(true);
|
||||
}
|
||||
|
||||
if (!tdc_open_view(thd, table_list, alias, key, key_length,
|
||||
mem_root, CHECK_METADATA_VERSION))
|
||||
{
|
||||
@ -5392,65 +5397,6 @@ bool lock_tables(THD *thd, TABLE_LIST *tables, uint count,
|
||||
*(ptr++)= table->table;
|
||||
}
|
||||
|
||||
/*
|
||||
DML statements that modify a table with an auto_increment column based on
|
||||
rows selected from a table are unsafe as the order in which the rows are
|
||||
fetched fron the select tables cannot be determined and may differ on
|
||||
master and slave.
|
||||
*/
|
||||
if (thd->variables.binlog_format != BINLOG_FORMAT_ROW && tables &&
|
||||
has_write_table_with_auto_increment_and_select(tables))
|
||||
thd->lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_WRITE_AUTOINC_SELECT);
|
||||
/* Todo: merge all has_write_table_auto_inc with decide_logging_format */
|
||||
if (thd->variables.binlog_format != BINLOG_FORMAT_ROW && tables)
|
||||
{
|
||||
if (has_write_table_auto_increment_not_first_in_pk(tables))
|
||||
thd->lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_AUTOINC_NOT_FIRST);
|
||||
}
|
||||
|
||||
#ifdef NOT_USED_IN_MARIADB
|
||||
/*
|
||||
INSERT...ON DUPLICATE KEY UPDATE on a table with more than one unique keys
|
||||
can be unsafe.
|
||||
*/
|
||||
uint unique_keys= 0;
|
||||
for (TABLE_LIST *query_table= tables; query_table && unique_keys <= 1;
|
||||
query_table= query_table->next_global)
|
||||
if(query_table->table)
|
||||
{
|
||||
uint keys= query_table->table->s->keys, i= 0;
|
||||
unique_keys= 0;
|
||||
for (KEY* keyinfo= query_table->table->s->key_info;
|
||||
i < keys && unique_keys <= 1; i++, keyinfo++)
|
||||
{
|
||||
if (keyinfo->flags & HA_NOSAME)
|
||||
unique_keys++;
|
||||
}
|
||||
if (!query_table->placeholder() &&
|
||||
query_table->lock_type >= TL_WRITE_ALLOW_WRITE &&
|
||||
unique_keys > 1 && thd->lex->sql_command == SQLCOM_INSERT &&
|
||||
/* Duplicate key update is not supported by INSERT DELAYED */
|
||||
thd->get_command() != COM_DELAYED_INSERT &&
|
||||
thd->lex->duplicates == DUP_UPDATE)
|
||||
thd->lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_INSERT_TWO_KEYS);
|
||||
}
|
||||
#endif
|
||||
|
||||
/* We have to emulate LOCK TABLES if we are statement needs prelocking. */
|
||||
if (thd->lex->requires_prelocking())
|
||||
{
|
||||
|
||||
/*
|
||||
A query that modifies autoinc column in sub-statement can make the
|
||||
master and slave inconsistent.
|
||||
We can solve these problems in mixed mode by switching to binlogging
|
||||
if at least one updated table is used by sub-statement
|
||||
*/
|
||||
if (thd->variables.binlog_format != BINLOG_FORMAT_ROW && tables &&
|
||||
has_write_table_with_auto_increment(thd->lex->first_not_own_table()))
|
||||
thd->lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_AUTOINC_COLUMNS);
|
||||
}
|
||||
|
||||
DEBUG_SYNC(thd, "before_lock_tables_takes_lock");
|
||||
|
||||
if (! (thd->lock= mysql_lock_tables(thd, start, (uint) (ptr - start),
|
||||
@ -9231,98 +9177,6 @@ bool is_equal(const LEX_STRING *a, const LEX_STRING *b)
|
||||
return a->length == b->length && !strncmp(a->str, b->str, a->length);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
Tells if two (or more) tables have auto_increment columns and we want to
|
||||
lock those tables with a write lock.
|
||||
|
||||
SYNOPSIS
|
||||
has_two_write_locked_tables_with_auto_increment
|
||||
tables Table list
|
||||
|
||||
NOTES:
|
||||
Call this function only when you have established the list of all tables
|
||||
which you'll want to update (including stored functions, triggers, views
|
||||
inside your statement).
|
||||
*/
|
||||
|
||||
static bool
|
||||
has_write_table_with_auto_increment(TABLE_LIST *tables)
|
||||
{
|
||||
for (TABLE_LIST *table= tables; table; table= table->next_global)
|
||||
{
|
||||
/* we must do preliminary checks as table->table may be NULL */
|
||||
if (!table->placeholder() &&
|
||||
table->table->found_next_number_field &&
|
||||
(table->lock_type >= TL_WRITE_ALLOW_WRITE))
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
checks if we have select tables in the table list and write tables
|
||||
with auto-increment column.
|
||||
|
||||
SYNOPSIS
|
||||
has_two_write_locked_tables_with_auto_increment_and_select
|
||||
tables Table list
|
||||
|
||||
RETURN VALUES
|
||||
|
||||
-true if the table list has atleast one table with auto-increment column
|
||||
|
||||
|
||||
and atleast one table to select from.
|
||||
-false otherwise
|
||||
*/
|
||||
|
||||
static bool
|
||||
has_write_table_with_auto_increment_and_select(TABLE_LIST *tables)
|
||||
{
|
||||
bool has_select= false;
|
||||
bool has_auto_increment_tables = has_write_table_with_auto_increment(tables);
|
||||
for(TABLE_LIST *table= tables; table; table= table->next_global)
|
||||
{
|
||||
if (!table->placeholder() &&
|
||||
(table->lock_type <= TL_READ_NO_INSERT))
|
||||
{
|
||||
has_select= true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return(has_select && has_auto_increment_tables);
|
||||
}
|
||||
|
||||
/*
|
||||
Tells if there is a table whose auto_increment column is a part
|
||||
of a compound primary key while is not the first column in
|
||||
the table definition.
|
||||
|
||||
@param tables Table list
|
||||
|
||||
@return true if the table exists, fais if does not.
|
||||
*/
|
||||
|
||||
static bool
|
||||
has_write_table_auto_increment_not_first_in_pk(TABLE_LIST *tables)
|
||||
{
|
||||
for (TABLE_LIST *table= tables; table; table= table->next_global)
|
||||
{
|
||||
/* we must do preliminary checks as table->table may be NULL */
|
||||
if (!table->placeholder() &&
|
||||
table->table->found_next_number_field &&
|
||||
(table->lock_type >= TL_WRITE_ALLOW_WRITE)
|
||||
&& table->table->s->next_number_keypart != 0)
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
Open and lock system tables for read.
|
||||
|
||||
|
115
sql/sql_class.cc
115
sql/sql_class.cc
@ -1,6 +1,6 @@
|
||||
/*
|
||||
Copyright (c) 2000, 2015, Oracle and/or its affiliates.
|
||||
Copyright (c) 2008, 2015, MariaDB
|
||||
Copyright (c) 2008, 2016, MariaDB
|
||||
|
||||
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
|
||||
@ -5090,6 +5090,94 @@ void xid_cache_delete(XID_STATE *xid_state)
|
||||
mysql_mutex_unlock(&LOCK_xid_cache);
|
||||
}
|
||||
|
||||
/*
|
||||
Tells if two (or more) tables have auto_increment columns and we want to
|
||||
lock those tables with a write lock.
|
||||
|
||||
SYNOPSIS
|
||||
has_two_write_locked_tables_with_auto_increment
|
||||
tables Table list
|
||||
|
||||
NOTES:
|
||||
Call this function only when you have established the list of all tables
|
||||
which you'll want to update (including stored functions, triggers, views
|
||||
inside your statement).
|
||||
*/
|
||||
|
||||
static bool
|
||||
has_write_table_with_auto_increment(TABLE_LIST *tables)
|
||||
{
|
||||
for (TABLE_LIST *table= tables; table; table= table->next_global)
|
||||
{
|
||||
/* we must do preliminary checks as table->table may be NULL */
|
||||
if (!table->placeholder() &&
|
||||
table->table->found_next_number_field &&
|
||||
(table->lock_type >= TL_WRITE_ALLOW_WRITE))
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
checks if we have select tables in the table list and write tables
|
||||
with auto-increment column.
|
||||
|
||||
SYNOPSIS
|
||||
has_two_write_locked_tables_with_auto_increment_and_select
|
||||
tables Table list
|
||||
|
||||
RETURN VALUES
|
||||
|
||||
-true if the table list has atleast one table with auto-increment column
|
||||
|
||||
|
||||
and atleast one table to select from.
|
||||
-false otherwise
|
||||
*/
|
||||
|
||||
static bool
|
||||
has_write_table_with_auto_increment_and_select(TABLE_LIST *tables)
|
||||
{
|
||||
bool has_select= false;
|
||||
bool has_auto_increment_tables = has_write_table_with_auto_increment(tables);
|
||||
for(TABLE_LIST *table= tables; table; table= table->next_global)
|
||||
{
|
||||
if (!table->placeholder() &&
|
||||
(table->lock_type <= TL_READ_NO_INSERT))
|
||||
{
|
||||
has_select= true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return(has_select && has_auto_increment_tables);
|
||||
}
|
||||
|
||||
/*
|
||||
Tells if there is a table whose auto_increment column is a part
|
||||
of a compound primary key while is not the first column in
|
||||
the table definition.
|
||||
|
||||
@param tables Table list
|
||||
|
||||
@return true if the table exists, fais if does not.
|
||||
*/
|
||||
|
||||
static bool
|
||||
has_write_table_auto_increment_not_first_in_pk(TABLE_LIST *tables)
|
||||
{
|
||||
for (TABLE_LIST *table= tables; table; table= table->next_global)
|
||||
{
|
||||
/* we must do preliminary checks as table->table may be NULL */
|
||||
if (!table->placeholder() &&
|
||||
table->table->found_next_number_field &&
|
||||
(table->lock_type >= TL_WRITE_ALLOW_WRITE)
|
||||
&& table->table->s->next_number_keypart != 0)
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
Decide on logging format to use for the statement and issue errors
|
||||
@ -5274,6 +5362,31 @@ int THD::decide_logging_format(TABLE_LIST *tables)
|
||||
}
|
||||
#endif
|
||||
|
||||
if (variables.binlog_format != BINLOG_FORMAT_ROW && tables)
|
||||
{
|
||||
/*
|
||||
DML statements that modify a table with an auto_increment column based on
|
||||
rows selected from a table are unsafe as the order in which the rows are
|
||||
fetched fron the select tables cannot be determined and may differ on
|
||||
master and slave.
|
||||
*/
|
||||
if (has_write_table_with_auto_increment_and_select(tables))
|
||||
lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_WRITE_AUTOINC_SELECT);
|
||||
|
||||
if (has_write_table_auto_increment_not_first_in_pk(tables))
|
||||
lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_AUTOINC_NOT_FIRST);
|
||||
|
||||
/*
|
||||
A query that modifies autoinc column in sub-statement can make the
|
||||
master and slave inconsistent.
|
||||
We can solve these problems in mixed mode by switching to binlogging
|
||||
if at least one updated table is used by sub-statement
|
||||
*/
|
||||
if (lex->requires_prelocking() &&
|
||||
has_write_table_with_auto_increment(lex->first_not_own_table()))
|
||||
lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_AUTOINC_COLUMNS);
|
||||
}
|
||||
|
||||
/*
|
||||
Get the capabilities vector for all involved storage engines and
|
||||
mask out the flags for the binary log.
|
||||
|
@ -1,6 +1,6 @@
|
||||
/*
|
||||
Copyright (c) 2000, 2015, Oracle and/or its affiliates.
|
||||
Copyright (c) 2009, 2015, MariaDB
|
||||
Copyright (c) 2009, 2016, MariaDB
|
||||
|
||||
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
|
||||
@ -4174,10 +4174,14 @@ public:
|
||||
#define TMP_ENGINE_COLUMNDEF MARIA_COLUMNDEF
|
||||
#define TMP_ENGINE_HTON maria_hton
|
||||
#define TMP_ENGINE_NAME "Aria"
|
||||
inline uint tmp_table_max_key_length() { return maria_max_key_length(); }
|
||||
inline uint tmp_table_max_key_parts() { return maria_max_key_segments(); }
|
||||
#else
|
||||
#define TMP_ENGINE_COLUMNDEF MI_COLUMNDEF
|
||||
#define TMP_ENGINE_HTON myisam_hton
|
||||
#define TMP_ENGINE_NAME "MyISAM"
|
||||
inline uint tmp_table_max_key_length() { return MI_MAX_KEY_LENGTH; }
|
||||
inline uint tmp_table_max_key_parts() { return MI_MAX_KEY_SEG; }
|
||||
#endif
|
||||
|
||||
/*
|
||||
|
@ -4174,6 +4174,8 @@ select_create::prepare(List<Item> &values, SELECT_LEX_UNIT *u)
|
||||
DBUG_RETURN(1);
|
||||
table->mark_columns_needed_for_insert();
|
||||
table->file->extra(HA_EXTRA_WRITE_CACHE);
|
||||
// Mark table as used
|
||||
table->query_id= thd->query_id;
|
||||
DBUG_RETURN(0);
|
||||
}
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
/* Copyright (c) 2000, 2014, Oracle and/or its affiliates.
|
||||
Copyright (c) 2009, 2015, MariaDB
|
||||
Copyright (c) 2009, 2016, MariaDB
|
||||
|
||||
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
|
||||
@ -3874,6 +3874,19 @@ void SELECT_LEX::update_used_tables()
|
||||
tl->on_expr->update_used_tables();
|
||||
tl->on_expr->walk(&Item::eval_not_null_tables, 0, NULL);
|
||||
}
|
||||
/*
|
||||
- There is no need to check sj_on_expr, because merged semi-joins inject
|
||||
sj_on_expr into the parent's WHERE clase.
|
||||
- For non-merged semi-joins (aka JTBMs), we need to check their
|
||||
left_expr. There is no need to check the rest of the subselect, we know
|
||||
it is uncorrelated and so cannot refer to any tables in this select.
|
||||
*/
|
||||
if (tl->jtbm_subselect)
|
||||
{
|
||||
Item *left_expr= tl->jtbm_subselect->left_expr;
|
||||
left_expr->walk(&Item::update_table_bitmaps_processor, FALSE, NULL);
|
||||
}
|
||||
|
||||
embedding= tl->embedding;
|
||||
while (embedding)
|
||||
{
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user