Merge tag 'mariadb-5.5.60' into 5.5-galera
This commit is contained in:
commit
a5001a2ad7
@ -4559,8 +4559,11 @@ static char *get_arg(char *line, get_arg_mode mode)
|
||||
}
|
||||
for (start=ptr ; *ptr; ptr++)
|
||||
{
|
||||
if ((*ptr == '\\' && ptr[1]) || // escaped character
|
||||
(!short_cmd && qtype && *ptr == qtype && ptr[1] == qtype)) // quote
|
||||
/* if short_cmd use historical rules (only backslash) otherwise SQL rules */
|
||||
if (short_cmd
|
||||
? (*ptr == '\\' && ptr[1]) // escaped character
|
||||
: (*ptr == '\\' && ptr[1] && qtype != '`') || // escaped character
|
||||
(qtype && *ptr == qtype && ptr[1] == qtype)) // quote
|
||||
{
|
||||
// Remove (or skip) the backslash (or a second quote)
|
||||
if (mode != CHECK)
|
||||
|
@ -148,6 +148,7 @@
|
||||
#cmakedefine HAVE_CUSERID 1
|
||||
#cmakedefine HAVE_CXX_NEW 1
|
||||
#cmakedefine HAVE_DIRECTIO 1
|
||||
#cmakedefine HAVE_DLADDR 1
|
||||
#cmakedefine HAVE_DLERROR 1
|
||||
#cmakedefine HAVE_DLOPEN 1
|
||||
#cmakedefine HAVE_DOPRNT 1
|
||||
|
@ -346,6 +346,7 @@ CHECK_FUNCTION_EXISTS (ftruncate HAVE_FTRUNCATE)
|
||||
CHECK_FUNCTION_EXISTS (getline HAVE_GETLINE)
|
||||
CHECK_FUNCTION_EXISTS (compress HAVE_COMPRESS)
|
||||
CHECK_FUNCTION_EXISTS (crypt HAVE_CRYPT)
|
||||
CHECK_FUNCTION_EXISTS (dladdr HAVE_DLADDR)
|
||||
CHECK_FUNCTION_EXISTS (dlerror HAVE_DLERROR)
|
||||
CHECK_FUNCTION_EXISTS (dlopen HAVE_DLOPEN)
|
||||
CHECK_FUNCTION_EXISTS (fchmod HAVE_FCHMOD)
|
||||
|
4
debian/dist/Debian/control
vendored
4
debian/dist/Debian/control
vendored
@ -12,8 +12,8 @@ Build-Depends: procps | hurd, debhelper, libncurses5-dev (>= 5.0-6),
|
||||
${CMAKE_DEP}libaio-dev, libjemalloc-dev (>= 3.0.0)
|
||||
Standards-Version: 3.8.3
|
||||
Homepage: http://mariadb.org/
|
||||
Vcs-Browser: http://bazaar.launchpad.net/~maria-captains/maria/5.5/files
|
||||
Vcs-Bzr: bzr://lp:maria
|
||||
Vcs-Git: https://github.com/MariaDB/server.git
|
||||
Vcs-Browser: https://github.com/MariaDB/server/
|
||||
|
||||
Package: mariadb-galera-test-5.5
|
||||
Section: database
|
||||
|
4
debian/dist/Ubuntu/control
vendored
4
debian/dist/Ubuntu/control
vendored
@ -12,8 +12,8 @@ Build-Depends: procps | hurd, debhelper, libncurses5-dev (>= 5.0-6),
|
||||
${CMAKE_DEP}libaio-dev, libjemalloc-dev (>= 3.0.0)
|
||||
Standards-Version: 3.8.2
|
||||
Homepage: http://mariadb.org/
|
||||
Vcs-Browser: http://bazaar.launchpad.net/~maria-captains/maria/5.5/files
|
||||
Vcs-Bzr: bzr://lp:maria
|
||||
Vcs-Git: https://github.com/MariaDB/server.git
|
||||
Vcs-Browser: https://github.com/MariaDB/server/
|
||||
|
||||
Package: mariadb-galera-test-5.5
|
||||
Section: database
|
||||
|
@ -787,6 +787,16 @@ int DoProcessReply(SSL& ssl)
|
||||
needHdr = true;
|
||||
else {
|
||||
buffer >> hdr;
|
||||
/*
|
||||
According to RFC 4346 (see "7.4.1.3. Server Hello"), the Server Hello
|
||||
packet needs to specify the highest supported TLS version, but not
|
||||
higher than what client requests. YaSSL highest supported version is
|
||||
TLSv1.1 (=3.2) - if the client requests a higher version, downgrade it
|
||||
here to 3.2.
|
||||
See also Appendix E of RFC 5246 (TLS 1.2)
|
||||
*/
|
||||
if (hdr.version_.major_ == 3 && hdr.version_.minor_ > 2)
|
||||
hdr.version_.minor_ = 2;
|
||||
ssl.verifyState(hdr);
|
||||
}
|
||||
|
||||
|
@ -144,6 +144,7 @@ typedef struct st_heap_share
|
||||
uint key_version; /* Updated on key change */
|
||||
uint file_version; /* Update on clear */
|
||||
uint reclength; /* Length of one record */
|
||||
uint visible; /* Offset to the visible/deleted mark */
|
||||
uint changed;
|
||||
uint keys,max_key_length;
|
||||
uint currently_disabled_keys; /* saved value from "keys" when disabled */
|
||||
|
@ -1379,11 +1379,19 @@ static inline char *dlerror(void)
|
||||
#ifndef HAVE_DLERROR
|
||||
#define dlerror() ""
|
||||
#endif
|
||||
#ifndef HAVE_DLADDR
|
||||
#define dladdr(A, B) 0
|
||||
/* Dummy definition in case we're missing dladdr() */
|
||||
typedef struct { const char *dli_fname, dli_fbase; } Dl_info;
|
||||
#endif
|
||||
#else
|
||||
#define dlerror() "No support for dynamic loading (static build?)"
|
||||
#define dlopen(A,B) 0
|
||||
#define dlsym(A,B) 0
|
||||
#define dlclose(A) 0
|
||||
#define dladdr(A, B) 0
|
||||
/* Dummy definition in case we're missing dladdr() */
|
||||
typedef struct { const char *dli_fname, dli_fbase; } Dl_info;
|
||||
#endif
|
||||
|
||||
/*
|
||||
|
@ -13,6 +13,14 @@
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
|
||||
|
||||
/* clang -> gcc */
|
||||
#ifndef __has_feature
|
||||
# define __has_feature(x) 0
|
||||
#endif
|
||||
#if __has_feature(address_sanitizer)
|
||||
# define __SANITIZE_ADDRESS__ 1
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_valgrind
|
||||
#define IF_VALGRIND(A,B) A
|
||||
#else
|
||||
@ -27,6 +35,8 @@
|
||||
# define MEM_CHECK_DEFINED(a,len) VALGRIND_CHECK_MEM_IS_DEFINED(a,len)
|
||||
#elif defined(__SANITIZE_ADDRESS__)
|
||||
# include <sanitizer/asan_interface.h>
|
||||
/* How to do manual poisoning:
|
||||
https://github.com/google/sanitizers/wiki/AddressSanitizerManualPoisoning */
|
||||
# define MEM_UNDEFINED(a,len) ASAN_UNPOISON_MEMORY_REGION(a,len)
|
||||
# define MEM_NOACCESS(a,len) ASAN_POISON_MEMORY_REGION(a,len)
|
||||
# define MEM_CHECK_ADDRESSABLE(a,len) ((void) 0)
|
||||
@ -39,10 +49,9 @@
|
||||
#endif /* HAVE_VALGRIND */
|
||||
|
||||
#ifndef DBUG_OFF
|
||||
#define TRASH_FILL(A,B,C) do { memset(A, C, B); MEM_UNDEFINED(A, B); } while (0)
|
||||
#define TRASH_FILL(A,B,C) do { MEM_UNDEFINED(A,B); memset(A,C,B); } while(0)
|
||||
#else
|
||||
#define TRASH_FILL(A,B,C) do { MEM_CHECK_ADDRESSABLE(A,B);MEM_UNDEFINED(A,B);} while (0)
|
||||
#define TRASH_FILL(A,B,C) do { MEM_UNDEFINED(A,B); } while(0)
|
||||
#endif
|
||||
#define TRASH_ALLOC(A,B) TRASH_FILL(A,B,0xA5)
|
||||
#define TRASH_FREE(A,B) TRASH_FILL(A,B,0x8F)
|
||||
#define TRASH(A,B) TRASH_FREE(A,B)
|
||||
#define TRASH_ALLOC(A,B) do { TRASH_FILL(A,B,0xA5); MEM_UNDEFINED(A,B); } while(0)
|
||||
#define TRASH_FREE(A,B) do { TRASH_FILL(A,B,0x8F); MEM_NOACCESS(A,B); } while(0)
|
||||
|
@ -1,5 +1,5 @@
|
||||
/* Copyright (c) 2000, 2011, Oracle and/or its affiliates.
|
||||
Copyright (c) 2010, 2013, Monty Program Ab
|
||||
Copyright (c) 2010, 2018, 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 SQL_COMMON_INCLUDED
|
||||
#define SQL_COMMON_INCLUDED
|
||||
/* Copyright (c) 2003, 2012, Oracle and/or its affiliates.
|
||||
Copyright (c) 2010, 2012, Monty Program Ab
|
||||
Copyright (c) 2010, 2018, 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
|
||||
|
@ -84,7 +84,7 @@ sub is_child {
|
||||
}
|
||||
|
||||
|
||||
my @safe_process_cmd;
|
||||
our @safe_process_cmd;
|
||||
my $safe_kill;
|
||||
my $bindir;
|
||||
|
||||
|
@ -2,7 +2,7 @@
|
||||
# -*- cperl -*-
|
||||
|
||||
# Copyright (c) 2004, 2014, Oracle and/or its affiliates.
|
||||
# Copyright (c) 2009, 2017, MariaDB Corporation
|
||||
# Copyright (c) 2009, 2018, MariaDB Corporation
|
||||
#
|
||||
# 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
|
||||
@ -1609,6 +1609,7 @@ sub command_line_setup {
|
||||
$opt_manual_debug || $opt_dbx || $opt_client_dbx || $opt_manual_dbx ||
|
||||
$opt_debugger || $opt_client_debugger )
|
||||
{
|
||||
$ENV{ASAN_OPTIONS}= 'abort_on_error=1:'.($ENV{ASAN_OPTIONS} || '');
|
||||
if ( using_extern() )
|
||||
{
|
||||
mtr_error("Can't use --extern when using debugger");
|
||||
@ -5381,7 +5382,7 @@ sub mysqld_start ($$) {
|
||||
my $args;
|
||||
mtr_init_args(\$args);
|
||||
|
||||
if ( $opt_valgrind_mysqld )
|
||||
if ( $opt_valgrind_mysqld and not $opt_gdb and not $opt_manual_gdb )
|
||||
{
|
||||
valgrind_arguments($args, \$exe);
|
||||
}
|
||||
@ -5984,11 +5985,20 @@ sub gdb_arguments {
|
||||
unlink($gdb_init_file);
|
||||
|
||||
# Put $args into a single string
|
||||
my $str= join(" ", @$$args);
|
||||
$input = $input ? "< $input" : "";
|
||||
|
||||
# write init file for mysqld or client
|
||||
mtr_tofile($gdb_init_file, "set args $str $input\n");
|
||||
if ($type ne 'client' and $opt_valgrind_mysqld) {
|
||||
my $v = $$exe;
|
||||
my $vargs = [];
|
||||
valgrind_arguments($vargs, \$v);
|
||||
mtr_tofile($gdb_init_file, <<EOF);
|
||||
shell @My::SafeProcess::safe_process_cmd --parent-pid=`pgrep -x gdb` -- $v --vgdb-error=0 @$vargs @$$args &
|
||||
shell sleep 1
|
||||
target remote | /usr/lib64/valgrind/../../bin/vgdb
|
||||
EOF
|
||||
} else {
|
||||
mtr_tofile($gdb_init_file, "set args @$$args $input\n");
|
||||
}
|
||||
|
||||
if ( $opt_manual_gdb )
|
||||
{
|
||||
|
@ -4397,5 +4397,36 @@ Field Type Null Key Default Extra
|
||||
c1 mediumtext YES NULL
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# MDEV-15624 Changing the default character set to utf8mb4 changes query evaluation in a very surprising way
|
||||
#
|
||||
SET NAMES utf8;
|
||||
CREATE TABLE t1 (id INT);
|
||||
INSERT INTO t1 VALUES (1),(2),(3);
|
||||
SELECT COUNT(DISTINCT c) FROM (SELECT id, REPLACE(uuid_short(), '0', CAST('o' AS CHAR CHARACTER SET ucs2)) AS c FROM t1) AS d1;
|
||||
COUNT(DISTINCT c)
|
||||
3
|
||||
SELECT DISTINCT REPLACE(uuid_short(), '0', CAST('o' AS CHAR CHARACTER SET ucs2)) AS c FROM t1;
|
||||
c
|
||||
xxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxx
|
||||
SELECT COUNT(DISTINCT c) FROM (SELECT id, INSERT(uuid_short(), 1, 1, CAST('0' AS CHAR CHARACTER SET ucs2)) AS c FROM t1) AS d1;
|
||||
COUNT(DISTINCT c)
|
||||
3
|
||||
SELECT DISTINCT INSERT(uuid_short(), 1, 1, CAST('0' AS CHAR CHARACTER SET ucs2)) AS c FROM t1;
|
||||
c
|
||||
xxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxx
|
||||
SELECT COUNT(DISTINCT c) FROM (SELECT id, CONCAT(uuid_short(), CAST('0' AS CHAR CHARACTER SET ucs2)) AS c FROM t1) AS d1;
|
||||
COUNT(DISTINCT c)
|
||||
3
|
||||
SELECT DISTINCT CONCAT(uuid_short(), CAST('0' AS CHAR CHARACTER SET ucs2)) AS c FROM t1;
|
||||
c
|
||||
xxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxx
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# End of 5.5 tests
|
||||
#
|
||||
|
@ -2656,6 +2656,29 @@ SELECT LENGTH(data) AS len FROM (SELECT REPEAT('☃', 65536) AS data ) AS sub;
|
||||
len
|
||||
196608
|
||||
#
|
||||
# MDEV-15624 Changing the default character set to utf8mb4 changes query evaluation in a very surprising way
|
||||
#
|
||||
SET NAMES utf8mb4;
|
||||
CREATE TABLE t1 (id INT);
|
||||
INSERT INTO t1 VALUES (1),(2),(3);
|
||||
SELECT COUNT(DISTINCT c) FROM (SELECT id, REPLACE(UUID(), "-", "") AS c FROM t1) AS d1;
|
||||
COUNT(DISTINCT c)
|
||||
3
|
||||
SELECT DISTINCT INSERT(uuid(), 9, 1, "X") AS c FROM t1;
|
||||
c
|
||||
xxxxxxxxxxxxx-xxxx-xxxx-xxxxxxxxxxxx
|
||||
xxxxxxxxxxxxx-xxxx-xxxx-xxxxxxxxxxxx
|
||||
xxxxxxxxxxxxx-xxxx-xxxx-xxxxxxxxxxxx
|
||||
SELECT COUNT(DISTINCT c) FROM (SELECT id, INSERT(UUID(), 9, 1, "X") AS c FROM t1) AS d1;
|
||||
COUNT(DISTINCT c)
|
||||
3
|
||||
SELECT DISTINCT INSERT(UUID(), 9, 1, "X") AS c FROM t1;
|
||||
c
|
||||
xxxxxxxxxxxxx-xxxx-xxxx-xxxxxxxxxxxx
|
||||
xxxxxxxxxxxxx-xxxx-xxxx-xxxxxxxxxxxx
|
||||
xxxxxxxxxxxxx-xxxx-xxxx-xxxxxxxxxxxx
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# End of 5.5 tests
|
||||
#
|
||||
#
|
||||
|
@ -1011,4 +1011,45 @@ id id data
|
||||
2 2 yes
|
||||
1 NULL NULL
|
||||
drop table t1;
|
||||
#
|
||||
# MDEV-14241: Server crash in key_copy / get_matching_chain_by_join_key
|
||||
# or valgrind warnings
|
||||
#
|
||||
CREATE TABLE t1 (a VARCHAR(10)) ENGINE=MyISAM;
|
||||
CREATE OR REPLACE ALGORITHM=TEMPTABLE VIEW v1 AS SELECT * FROM t1;
|
||||
INSERT INTO t1 VALUES ('foo'),('bar');
|
||||
CREATE TABLE t2 (b integer auto_increment primary key) ENGINE=MyISAM;
|
||||
INSERT INTO t2 VALUES (NULL),(NULL);
|
||||
CREATE TABLE t3 (c VARCHAR(1024) CHARACTER SET utf8, d INT) ENGINE=MyISAM;
|
||||
CREATE OR REPLACE ALGORITHM=TEMPTABLE VIEW v3 AS SELECT * FROM t3;
|
||||
INSERT INTO t3 VALUES ('abc',NULL),('def',4);
|
||||
SET join_cache_level= 8;
|
||||
explain
|
||||
SELECT * FROM v1, t2, v3 WHERE a = c AND b = d;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY <derived2> ALL NULL NULL NULL NULL 2
|
||||
1 PRIMARY <derived3> hash_ALL NULL #hash#$hj 3075 func 2 Using where; Using join buffer (flat, BNLH join)
|
||||
1 PRIMARY t2 eq_ref PRIMARY PRIMARY 4 v3.d 1 Using index
|
||||
3 DERIVED t3 ALL NULL NULL NULL NULL 2
|
||||
2 DERIVED t1 ALL NULL NULL NULL NULL 2
|
||||
SELECT * FROM v1, t2, v3 WHERE a = c AND b = d;
|
||||
a b c d
|
||||
DROP VIEW v1, v3;
|
||||
DROP TABLE t1, t2, t3;
|
||||
#
|
||||
# MDEV-14786: Server crashes in Item_cond::transform on 2nd
|
||||
# execution of SP querying from a view
|
||||
#
|
||||
create table t1 (i int, row_start timestamp(6) not null default now(),
|
||||
row_end timestamp(6) not null default '2030-01-01 0:0:0');
|
||||
create view v1 as select i from t1 where i < 5 and (row_end =
|
||||
TIMESTAMP'2030-01-01 0:0:0' or row_end is null);
|
||||
create procedure pr(x int) select i from v1;
|
||||
call pr(1);
|
||||
i
|
||||
call pr(2);
|
||||
i
|
||||
drop procedure pr;
|
||||
drop view v1;
|
||||
drop table t1;
|
||||
# end of 5.5
|
||||
|
@ -572,6 +572,17 @@ N AVG
|
||||
0 NULL
|
||||
drop table t1;
|
||||
#
|
||||
# MDEV-15630 uuid() function evaluates at wrong time in query
|
||||
#
|
||||
CREATE TABLE t1 (id INT);
|
||||
INSERT INTO t1 VALUES (1),(2),(3);
|
||||
SELECT COUNT(1), UUID() as uid FROM t1 GROUP BY uid;
|
||||
COUNT(1) uid
|
||||
1 xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
|
||||
1 xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
|
||||
1 xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# End of 5.5 tests
|
||||
#
|
||||
SELECT NAME_CONST('a', -(1 OR 2)) OR 1;
|
||||
|
@ -5813,4 +5813,62 @@ id select_type table type possible_keys key key_len ref rows Extra
|
||||
set join_buffer_size=default;
|
||||
set join_cache_level = default;
|
||||
DROP TABLE t1,t2;
|
||||
#
|
||||
# MDEV-14960: BNLH used for materialized semi-join
|
||||
#
|
||||
CREATE TABLE t1 (i1 int);
|
||||
CREATE TABLE t2 (e1 int);
|
||||
CREATE TABLE t4 (e1 int);
|
||||
CREATE TABLE t5 (e1 int);
|
||||
INSERT INTO t1 VALUES
|
||||
(1),(2),(3),(4),(5),(6),(7),(8);
|
||||
INSERT INTO t1 SELECT i1+8 FROM t1;
|
||||
INSERT INTO t1 SELECT i1+16 FROM t1;
|
||||
INSERT INTO t1 SELECT i1+32 FROM t1;
|
||||
INSERT INTO t1 SELECT i1+64 FROM t1;
|
||||
INSERT INTO t2 SELECT * FROM t1;
|
||||
INSERT INTO t4 SELECT * FROM t1;
|
||||
INSERT INTO t5 SELECT * FROM t1;
|
||||
set @save_optimizer_switch= @@optimizer_switch;
|
||||
SET join_cache_level = 6;
|
||||
SET join_buffer_size=4096;
|
||||
SET join_buffer_space_limit=4096;
|
||||
SET optimizer_switch = 'join_cache_hashed=on,optimize_join_buffer_size=on';
|
||||
EXPLAIN SELECT * FROM t1
|
||||
WHERE
|
||||
i1 < 10 AND
|
||||
i1 IN
|
||||
(SELECT i1 FROM
|
||||
(SELECT (t4.e1) i1 FROM t4
|
||||
LEFT JOIN t5 ON t4.e1 = t5.e1
|
||||
LEFT JOIN (SELECT e1 FROM t2 ) AS d ON t4.e1 = d.e1) a);
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY t1 ALL NULL NULL NULL NULL 128 Using where
|
||||
1 PRIMARY <subquery2> eq_ref distinct_key distinct_key 4 func 1
|
||||
2 MATERIALIZED t4 ALL NULL NULL NULL NULL 128
|
||||
2 MATERIALIZED t5 hash_ALL NULL #hash#$hj 5 test.t4.e1 128 Using where; Using join buffer (flat, BNLH join)
|
||||
2 MATERIALIZED t2 hash_ALL NULL #hash#$hj 5 test.t4.e1 128 Using where; Using join buffer (incremental, BNLH join)
|
||||
SELECT * FROM t1
|
||||
WHERE
|
||||
i1 < 10 AND
|
||||
i1 IN
|
||||
(SELECT i1 FROM
|
||||
(SELECT (t4.e1) i1 FROM t4
|
||||
LEFT JOIN t5 ON t4.e1 = t5.e1
|
||||
LEFT JOIN (SELECT e1 FROM t2 ) AS d ON t4.e1 = d.e1) a);
|
||||
i1
|
||||
1
|
||||
2
|
||||
3
|
||||
4
|
||||
5
|
||||
6
|
||||
7
|
||||
8
|
||||
9
|
||||
SET join_cache_level = default;
|
||||
SET join_buffer_size = default;
|
||||
SET join_buffer_space_limit= default;
|
||||
set optimizer_switch=@save_optimizer_switch;
|
||||
DROP TABLE t1,t4,t5,t2;
|
||||
set @@optimizer_switch=@save_optimizer_switch;
|
||||
|
@ -2346,11 +2346,27 @@ CREATE TABLE t1 (b1 BIT NOT NULL);
|
||||
INSERT INTO t1 VALUES (0),(1);
|
||||
CREATE TABLE t2 (b2 BIT NOT NULL);
|
||||
INSERT INTO t2 VALUES (0),(1);
|
||||
SET SESSION JOIN_CACHE_LEVEL = 3;
|
||||
set @save_join_cache_level= @@join_cache_level;
|
||||
SET @@join_cache_level = 3;
|
||||
SELECT t1.b1+'0' , t2.b2 + '0' FROM t1 LEFT JOIN t2 ON b1 = b2;
|
||||
t1.b1+'0' t2.b2 + '0'
|
||||
0 0
|
||||
1 1
|
||||
DROP TABLE t1, t2;
|
||||
set @join_cache_level= @save_join_cache_level;
|
||||
#
|
||||
# MDEV-14779: using left join causes incorrect results with materialization and derived tables
|
||||
#
|
||||
create table t1(id int);
|
||||
insert into t1 values (1),(2);
|
||||
create table t2(sid int, id int);
|
||||
insert into t2 values (1,1),(2,2);
|
||||
select * from t1 t
|
||||
left join (select * from t2 where sid in (select max(sid) from t2 where 0=1 group by id)) r
|
||||
on t.id=r.id ;
|
||||
id sid id
|
||||
1 NULL NULL
|
||||
2 NULL NULL
|
||||
drop table t1, t2;
|
||||
# end of 5.5 tests
|
||||
SET optimizer_switch=@save_optimizer_switch;
|
||||
|
@ -2357,12 +2357,28 @@ CREATE TABLE t1 (b1 BIT NOT NULL);
|
||||
INSERT INTO t1 VALUES (0),(1);
|
||||
CREATE TABLE t2 (b2 BIT NOT NULL);
|
||||
INSERT INTO t2 VALUES (0),(1);
|
||||
SET SESSION JOIN_CACHE_LEVEL = 3;
|
||||
set @save_join_cache_level= @@join_cache_level;
|
||||
SET @@join_cache_level = 3;
|
||||
SELECT t1.b1+'0' , t2.b2 + '0' FROM t1 LEFT JOIN t2 ON b1 = b2;
|
||||
t1.b1+'0' t2.b2 + '0'
|
||||
0 0
|
||||
1 1
|
||||
DROP TABLE t1, t2;
|
||||
set @join_cache_level= @save_join_cache_level;
|
||||
#
|
||||
# MDEV-14779: using left join causes incorrect results with materialization and derived tables
|
||||
#
|
||||
create table t1(id int);
|
||||
insert into t1 values (1),(2);
|
||||
create table t2(sid int, id int);
|
||||
insert into t2 values (1,1),(2,2);
|
||||
select * from t1 t
|
||||
left join (select * from t2 where sid in (select max(sid) from t2 where 0=1 group by id)) r
|
||||
on t.id=r.id ;
|
||||
id sid id
|
||||
1 NULL NULL
|
||||
2 NULL NULL
|
||||
drop table t1, t2;
|
||||
# end of 5.5 tests
|
||||
SET optimizer_switch=@save_optimizer_switch;
|
||||
set join_cache_level=default;
|
||||
|
44
mysql-test/r/mdev_14586.result
Normal file
44
mysql-test/r/mdev_14586.result
Normal file
@ -0,0 +1,44 @@
|
||||
create table t1(a bit(1), b int auto_increment ,id int, index(a,b));
|
||||
insert into t1 values(1,null,1);
|
||||
insert into t1 values(1,null,2);
|
||||
insert into t1 values(0,null,3);
|
||||
insert into t1 values(0,null,4);
|
||||
select a+0, b as auto_increment , id from t1 order by id;
|
||||
a+0 auto_increment id
|
||||
1 1 1
|
||||
1 2 2
|
||||
0 1 3
|
||||
0 2 4
|
||||
drop table t1;
|
||||
create table t1(a int auto_increment, b bit(5) ,id int, index (b,a));
|
||||
insert into t1 values(null,b'1',1);
|
||||
insert into t1 values(null,b'1',2);
|
||||
insert into t1 values(null,b'11',3);
|
||||
insert into t1 values(null,b'11',4);
|
||||
select a as auto_increment, b+0, id from t1 order by id;
|
||||
auto_increment b+0 id
|
||||
1 1 1
|
||||
2 1 2
|
||||
1 3 3
|
||||
2 3 4
|
||||
drop table t1;
|
||||
create table t1(a bit(1), b int auto_increment , c bit(1) , d bit(1), id int,index(a,c,b,d));
|
||||
insert into t1 values(1,null,1,1,1);
|
||||
insert into t1 values(1,null,1,1,2);
|
||||
insert into t1 values(0,null,1,1,3);
|
||||
insert into t1 values(1,null,0,1,4);
|
||||
select a+0, b as auto_increment, c+0, d+0, id from t1 order by id;
|
||||
a+0 auto_increment c+0 d+0 id
|
||||
1 1 1 1 1
|
||||
1 2 1 1 2
|
||||
0 1 1 1 3
|
||||
1 1 0 1 4
|
||||
drop table t1;
|
||||
CREATE TABLE t1 (b BIT(1), pk INTEGER AUTO_INCREMENT PRIMARY KEY);
|
||||
ALTER TABLE t1 ADD INDEX(b,pk);
|
||||
INSERT INTO t1 VALUES (1,b'1');
|
||||
ALTER TABLE t1 DROP PRIMARY KEY;
|
||||
select b+0, pk as auto_increment from t1;
|
||||
b+0 auto_increment
|
||||
1 1
|
||||
DROP TABLE t1;
|
@ -1,8 +1,10 @@
|
||||
The following options may be given as the first argument:
|
||||
--print-defaults Print the program argument list and exit.
|
||||
--no-defaults Don't read default options from any option file.
|
||||
The following specify which files/extra groups are read (specified before remaining options):
|
||||
--defaults-file=# Only read default options from the given file #.
|
||||
--defaults-extra-file=# Read this file after the global files are read.
|
||||
--defaults-group-suffix=# Additionally read default groups with # appended as a suffix.
|
||||
|
||||
--allow-suspicious-udfs
|
||||
Allows use of UDFs consisting of only one symbol xxx()
|
||||
|
@ -124,3 +124,46 @@ v1
|
||||
1v
|
||||
drop database `mysqltest1
|
||||
1tsetlqsym`;
|
||||
create database `test```;
|
||||
create database `test\``
|
||||
\! ls
|
||||
#`;
|
||||
show databases like 'test%';
|
||||
Database (test%)
|
||||
test
|
||||
test\`
|
||||
\! ls
|
||||
#
|
||||
test`
|
||||
|
||||
--
|
||||
-- Current Database: `test```
|
||||
--
|
||||
|
||||
/*!40000 DROP DATABASE IF EXISTS `test```*/;
|
||||
|
||||
CREATE DATABASE /*!32312 IF NOT EXISTS*/ `test``` /*!40100 DEFAULT CHARACTER SET latin1 */;
|
||||
|
||||
USE `test```;
|
||||
|
||||
--
|
||||
-- Current Database: `test\``
|
||||
-- \! ls
|
||||
-- #`
|
||||
--
|
||||
|
||||
/*!40000 DROP DATABASE IF EXISTS `test\``
|
||||
\! ls
|
||||
#`*/;
|
||||
|
||||
CREATE DATABASE /*!32312 IF NOT EXISTS*/ `test\``
|
||||
\! ls
|
||||
#` /*!40100 DEFAULT CHARACTER SET latin1 */;
|
||||
|
||||
USE `test\``
|
||||
\! ls
|
||||
#`;
|
||||
drop database `test```;
|
||||
drop database `test\``
|
||||
\! ls
|
||||
#`;
|
||||
|
@ -672,3 +672,10 @@ ERROR 42000: You have an error in your SQL syntax; check the manual that corresp
|
||||
PREPARE stmt FROM 'CREATE TRIGGER tr AFTER DELETE ON t1 FOR EACH ROW SET @a = 1\\';
|
||||
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '\' at line 1
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# MDEV-15620 Crash when using "SET @@NEW.a=expr" inside a trigger
|
||||
#
|
||||
CREATE TABLE t1 (a INT);
|
||||
CREATE TRIGGER tr1 BEFORE INSERT ON t1 FOR EACH ROW SET @@NEW.a=0;
|
||||
ERROR HY000: Unknown system variable 'NEW'
|
||||
DROP TABLE t1;
|
||||
|
23
mysql-test/r/ps_qc_innodb.result
Normal file
23
mysql-test/r/ps_qc_innodb.result
Normal file
@ -0,0 +1,23 @@
|
||||
#
|
||||
# MDEV-15492: Subquery crash similar to MDEV-10050
|
||||
#
|
||||
SET @qcs.save= @@global.query_cache_size, @qct.save= @@global.query_cache_type;
|
||||
SET GLOBAL query_cache_size= 512*1024*1024, query_cache_type= ON;
|
||||
CREATE TABLE t1 (a INT) ENGINE=InnoDB;
|
||||
CREATE TABLE t2 (b INT) ENGINE=InnoDB;
|
||||
CREATE VIEW v AS select a from t1 join t2;
|
||||
PREPARE stmt1 FROM "SELECT * FROM t1 WHERE a in (SELECT a FROM v)";
|
||||
PREPARE stmt2 FROM "SELECT * FROM t1 WHERE a in (SELECT a FROM v)";
|
||||
EXECUTE stmt2;
|
||||
a
|
||||
EXECUTE stmt1;
|
||||
a
|
||||
INSERT INTO t2 VALUES (0);
|
||||
EXECUTE stmt1;
|
||||
a
|
||||
START TRANSACTION;
|
||||
EXECUTE stmt1;
|
||||
a
|
||||
DROP VIEW v;
|
||||
DROP TABLE t1, t2;
|
||||
SET GLOBAL query_cache_size= @qcs.save, query_cache_type= @qct.save;
|
@ -221,6 +221,14 @@ a a
|
||||
5 10
|
||||
DROP TABLE temp1, temp2;
|
||||
|
||||
# MDEV-14185 CREATE TEMPORARY TABLE AS SELECT causes error 1290 with read_only and InnoDB.
|
||||
|
||||
CREATE TEMPORARY TABLE temp1 ENGINE=INNODB AS SELECT a FROM t1;
|
||||
SELECT * FROM temp1;
|
||||
a
|
||||
1
|
||||
DROP TABLE temp1;
|
||||
|
||||
# Disconnect and cleanup
|
||||
|
||||
SET GLOBAL READ_ONLY = OFF;
|
||||
|
@ -174,3 +174,9 @@ create database mysqltest1;
|
||||
create procedure mysqltest1.foo() select "foo";
|
||||
update mysql.proc set name='' where db='mysqltest1';
|
||||
drop database mysqltest1;
|
||||
create procedure p1() set @foo = 10;
|
||||
alter table mysql.proc drop primary key;
|
||||
drop procedure p1;
|
||||
ERROR HY000: Cannot load from mysql.proc. The table is probably corrupted
|
||||
alter table mysql.proc add primary key (db,name,type);
|
||||
drop procedure p1;
|
||||
|
@ -1056,7 +1056,7 @@ EXPLAIN
|
||||
SELECT * FROM t1 WHERE (2, 0) NOT IN (SELECT min(f3)+f3, min(f4)+f3+max(f4) FROM t2 WHERE f3 > 10);
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY NULL NULL NULL NULL NULL NULL NULL Impossible WHERE
|
||||
2 SUBQUERY NULL NULL NULL NULL NULL NULL NULL No matching min/max row
|
||||
2 SUBQUERY NULL NULL NULL NULL NULL NULL NULL Impossible WHERE noticed after reading const tables
|
||||
SELECT * FROM t1 WHERE (2, 0) NOT IN (SELECT min(f3)+f3, min(f4)+f3+max(f4) FROM t2 WHERE f3 > 10);
|
||||
f1 f2
|
||||
SET @@optimizer_switch = 'materialization=off,in_to_exists=on,semijoin=off';
|
||||
@ -1147,7 +1147,7 @@ EXPLAIN
|
||||
SELECT * FROM t1 WHERE (2, 0) NOT IN (SELECT min(f3)+f3, min(f4)+f3+max(f4) FROM t2 WHERE f3 > 10);
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY NULL NULL NULL NULL NULL NULL NULL Impossible WHERE
|
||||
2 SUBQUERY NULL NULL NULL NULL NULL NULL NULL No matching min/max row
|
||||
2 SUBQUERY NULL NULL NULL NULL NULL NULL NULL Impossible WHERE noticed after reading const tables
|
||||
SELECT * FROM t1 WHERE (2, 0) NOT IN (SELECT min(f3)+f3, min(f4)+f3+max(f4) FROM t2 WHERE f3 > 10);
|
||||
f1 f2
|
||||
set @@optimizer_switch=@save_optimizer_switch;
|
||||
@ -2498,5 +2498,36 @@ FROM t2 WHERE b <= 'quux' GROUP BY field;
|
||||
field COUNT(DISTINCT c)
|
||||
0 1
|
||||
drop table t1,t2;
|
||||
#
|
||||
# MDEV-15555: select from DUAL where false yielding wrong result when in a IN
|
||||
#
|
||||
explain
|
||||
SELECT 2 IN (SELECT 2 from DUAL WHERE 1 != 1);
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY NULL NULL NULL NULL NULL NULL NULL No tables used
|
||||
2 SUBQUERY NULL NULL NULL NULL NULL NULL NULL Impossible WHERE
|
||||
SELECT 2 IN (SELECT 2 from DUAL WHERE 1 != 1);
|
||||
2 IN (SELECT 2 from DUAL WHERE 1 != 1)
|
||||
0
|
||||
SET optimizer_switch= @@global.optimizer_switch;
|
||||
set @@tmp_table_size= @@global.tmp_table_size;
|
||||
#
|
||||
# mfrv-14515: Wrong results for tableless query with subquery in WHERE
|
||||
# and implicit aggregation
|
||||
#
|
||||
create table t1 (i1 int, i2 int);
|
||||
insert into t1 values (1314, 1084),(1330, 1084),(1401, 1084),(580, 1084);
|
||||
create table t2 (cd int);
|
||||
insert into t2 values
|
||||
(1330), (1330), (1330), (1330), (1330), (1330), (1330), (1330),
|
||||
(1330), (1330), (1330), (1330), (1330), (1330), (1330), (1330);
|
||||
select max(10) from dual
|
||||
where exists (select 1 from t2 join t1 on t1.i1 = t2.cd and t1.i2 = 345);
|
||||
max(10)
|
||||
NULL
|
||||
insert into t2 select * from t2;
|
||||
select max(10) from dual
|
||||
where exists (select 1 from t2 join t1 on t1.i1 = t2.cd and t1.i2 = 345);
|
||||
max(10)
|
||||
NULL
|
||||
DROP TABLE t1,t2;
|
||||
|
@ -2642,3 +2642,18 @@ a b sq
|
||||
4 4 1
|
||||
4 2 1
|
||||
drop table t1, t2;
|
||||
#
|
||||
# MDEV-15235: Assertion `length > 0' failed in create_ref_for_key
|
||||
#
|
||||
CREATE TABLE t1 (i INT);
|
||||
INSERT INTO t1 VALUES (1),(2);
|
||||
CREATE TABLE t2 (f CHAR(1));
|
||||
INSERT INTO t2 VALUES ('a'),('b');
|
||||
explain
|
||||
SELECT * FROM t2 WHERE f IN ( SELECT LEFT('foo',0) FROM t1 ORDER BY 1 );
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY t2 ALL NULL NULL NULL NULL 2 Using where
|
||||
2 DEPENDENT SUBQUERY t1 ALL NULL NULL NULL NULL 2
|
||||
SELECT * FROM t2 WHERE f IN ( SELECT LEFT('foo',0) FROM t1 ORDER BY 1 );
|
||||
f
|
||||
DROP TABLE t1, t2;
|
||||
|
@ -1995,4 +1995,41 @@ avg(f) sub
|
||||
31.5000 0
|
||||
1.5000 1
|
||||
drop table t1,t2,t3;
|
||||
#
|
||||
# MDEV-14715 Assertion `!table || (!table->read_set ||
|
||||
# bitmap_is_set(table->read_set, field_index))'
|
||||
# failed in Field_num::val_decimal
|
||||
#
|
||||
CREATE TABLE t1 (a INT, b INT) ENGINE=MyISAM;
|
||||
CREATE VIEW v1 AS SELECT * FROM t1;
|
||||
INSERT INTO t1 VALUES (1, NULL),(3, 4);
|
||||
(SELECT a, sum(a) AS f FROM v1 group by a ORDER BY b + sum(a))
|
||||
UNION
|
||||
(SELECT 2, 2);
|
||||
ERROR HY000: Invalid use of group function
|
||||
(SELECT a, sum(a) AS f FROM v1 group by a ORDER BY b + 1)
|
||||
UNION
|
||||
(SELECT 2, 2);
|
||||
a f
|
||||
1 1
|
||||
3 3
|
||||
2 2
|
||||
SELECT a, b FROM t1
|
||||
UNION
|
||||
(SELECT a, VAR_POP(a) AS f FROM v1 GROUP BY a ORDER BY b/a );
|
||||
a b
|
||||
1 NULL
|
||||
3 4
|
||||
1 0
|
||||
3 0
|
||||
DROP TABLE t1;
|
||||
(SELECT a, sum(a) AS f FROM v1 group by a ORDER BY b + 1)
|
||||
UNION
|
||||
(SELECT 2, 2);
|
||||
ERROR HY000: View 'test.v1' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them
|
||||
DROP VIEW v1;
|
||||
(SELECT a, sum(a) AS f FROM v1 group by a ORDER BY b + 1)
|
||||
UNION
|
||||
(SELECT 2, 2);
|
||||
ERROR 42S02: Table 'test.v1' doesn't exist
|
||||
End of 5.5 tests
|
||||
|
@ -5236,114 +5236,6 @@ execute stmt1;
|
||||
deallocate prepare stmt1;
|
||||
drop view v1,v2;
|
||||
drop table t1,t2;
|
||||
#
|
||||
# MDEV-6251: SIGSEGV in query optimizer (in set_check_materialized
|
||||
# with MERGE view)
|
||||
#
|
||||
CREATE TABLE t1 (a1 INT(11) NOT NULL DEFAULT NULL AUTO_INCREMENT PRIMARY KEY);
|
||||
CREATE TABLE t2 (b1 INT(11) NOT NULL DEFAULT NULL AUTO_INCREMENT PRIMARY KEY);
|
||||
CREATE TABLE t3 (c1 INT(11) NOT NULL DEFAULT NULL AUTO_INCREMENT PRIMARY KEY);
|
||||
CREATE TABLE t4 (d1 INT(11) NOT NULL DEFAULT NULL AUTO_INCREMENT PRIMARY KEY);
|
||||
CREATE TABLE t5 (e1 INT(11) NOT NULL DEFAULT NULL AUTO_INCREMENT PRIMARY KEY);
|
||||
CREATE TABLE t6 (f1 INT(11) NOT NULL DEFAULT NULL AUTO_INCREMENT PRIMARY KEY);
|
||||
CREATE OR REPLACE view v1 AS
|
||||
SELECT 1
|
||||
FROM t1 a_alias_1
|
||||
LEFT JOIN (t2 b_alias_1 JOIN t1 a_alias_2) ON b_alias_1.b1 = a_alias_1.a1 AND a_alias_2.a1 = a_alias_1.a1
|
||||
LEFT JOIN t3 c_alias_1 ON c_alias_1.c1 = a_alias_1.a1
|
||||
LEFT JOIN t4 d_alias_1 ON d_alias_1.d1 = a_alias_1.a1
|
||||
LEFT JOIN t3 c_alias_2 ON c_alias_2.c1 = a_alias_1.a1
|
||||
LEFT JOIN t5 e_alias_1 ON e_alias_1.e1 = a_alias_1.a1
|
||||
LEFT JOIN t6 f_alias_1 ON f_alias_1.f1 = a_alias_1.a1
|
||||
;
|
||||
SELECT 1
|
||||
FROM (( SELECT 1
|
||||
FROM t1 a_alias_1
|
||||
LEFT JOIN (t2 b_alias_1 JOIN t1 a_alias_2) ON b_alias_1.b1 = a_alias_1.a1 AND a_alias_2.a1 = a_alias_1.a1
|
||||
LEFT JOIN t3 c_alias_1 ON c_alias_1.c1 = a_alias_1.a1
|
||||
LEFT JOIN t4 d_alias_1 ON d_alias_1.d1 = a_alias_1.a1
|
||||
LEFT JOIN t3 c_alias_2 ON c_alias_2.c1 = a_alias_1.a1
|
||||
LEFT JOIN t5 e_alias_1 ON e_alias_1.e1 = a_alias_1.a1
|
||||
LEFT JOIN t6 f_alias_1 ON f_alias_1.f1 = a_alias_1.a1
|
||||
) t1)
|
||||
LEFT OUTER JOIN (( SELECT 1
|
||||
FROM t1 a_alias_1
|
||||
LEFT JOIN (t2 b_alias_1 JOIN t1 a_alias_2) ON b_alias_1.b1 = a_alias_1.a1 AND a_alias_2.a1 = a_alias_1.a1
|
||||
LEFT JOIN t3 c_alias_1 ON c_alias_1.c1 = a_alias_1.a1
|
||||
LEFT JOIN t4 d_alias_1 ON d_alias_1.d1 = a_alias_1.a1
|
||||
LEFT JOIN t3 c_alias_2 ON c_alias_2.c1 = a_alias_1.a1
|
||||
LEFT JOIN t5 e_alias_1 ON e_alias_1.e1 = a_alias_1.a1
|
||||
LEFT JOIN t6 f_alias_1 ON f_alias_1.f1 = a_alias_1.a1
|
||||
) t2) ON 1=1
|
||||
LEFT OUTER JOIN (( SELECT 1
|
||||
FROM t1 a_alias_1
|
||||
LEFT JOIN (t2 b_alias_1 JOIN t1 a_alias_2) ON b_alias_1.b1 = a_alias_1.a1 AND a_alias_2.a1 = a_alias_1.a1
|
||||
LEFT JOIN t3 c_alias_1 ON c_alias_1.c1 = a_alias_1.a1
|
||||
LEFT JOIN t4 d_alias_1 ON d_alias_1.d1 = a_alias_1.a1
|
||||
LEFT JOIN t3 c_alias_2 ON c_alias_2.c1 = a_alias_1.a1
|
||||
LEFT JOIN t5 e_alias_1 ON e_alias_1.e1 = a_alias_1.a1
|
||||
LEFT JOIN t6 f_alias_1 ON f_alias_1.f1 = a_alias_1.a1
|
||||
) t3) ON 1=1
|
||||
LEFT OUTER JOIN (( SELECT 1
|
||||
FROM t1 a_alias_1
|
||||
LEFT JOIN (t2 b_alias_1 JOIN t1 a_alias_2) ON b_alias_1.b1 = a_alias_1.a1 AND a_alias_2.a1 = a_alias_1.a1
|
||||
LEFT JOIN t3 c_alias_1 ON c_alias_1.c1 = a_alias_1.a1
|
||||
LEFT JOIN t4 d_alias_1 ON d_alias_1.d1 = a_alias_1.a1
|
||||
LEFT JOIN t3 c_alias_2 ON c_alias_2.c1 = a_alias_1.a1
|
||||
LEFT JOIN t5 e_alias_1 ON e_alias_1.e1 = a_alias_1.a1
|
||||
LEFT JOIN t6 f_alias_1 ON f_alias_1.f1 = a_alias_1.a1
|
||||
) t4) ON 1=1
|
||||
LEFT OUTER JOIN (( SELECT 1
|
||||
FROM t1 a_alias_1
|
||||
LEFT JOIN (t2 b_alias_1 JOIN t1 a_alias_2) ON b_alias_1.b1 = a_alias_1.a1 AND a_alias_2.a1 = a_alias_1.a1
|
||||
LEFT JOIN t3 c_alias_1 ON c_alias_1.c1 = a_alias_1.a1
|
||||
LEFT JOIN t4 d_alias_1 ON d_alias_1.d1 = a_alias_1.a1
|
||||
LEFT JOIN t3 c_alias_2 ON c_alias_2.c1 = a_alias_1.a1
|
||||
LEFT JOIN t5 e_alias_1 ON e_alias_1.e1 = a_alias_1.a1
|
||||
LEFT JOIN t6 f_alias_1 ON f_alias_1.f1 = a_alias_1.a1
|
||||
) t5) ON 1=1
|
||||
LEFT OUTER JOIN (( SELECT 1
|
||||
FROM t1 a_alias_1
|
||||
LEFT JOIN (t2 b_alias_1 JOIN t1 a_alias_2) ON b_alias_1.b1 = a_alias_1.a1 AND a_alias_2.a1 = a_alias_1.a1
|
||||
LEFT JOIN t3 c_alias_1 ON c_alias_1.c1 = a_alias_1.a1
|
||||
LEFT JOIN t4 d_alias_1 ON d_alias_1.d1 = a_alias_1.a1
|
||||
LEFT JOIN t3 c_alias_2 ON c_alias_2.c1 = a_alias_1.a1
|
||||
LEFT JOIN t5 e_alias_1 ON e_alias_1.e1 = a_alias_1.a1
|
||||
LEFT JOIN t6 f_alias_1 ON f_alias_1.f1 = a_alias_1.a1
|
||||
) t6) ON 1=1
|
||||
LEFT OUTER JOIN (( SELECT 1
|
||||
FROM t1 a_alias_1
|
||||
LEFT JOIN (t2 b_alias_1 JOIN t1 a_alias_2) ON b_alias_1.b1 = a_alias_1.a1 AND a_alias_2.a1 = a_alias_1.a1
|
||||
LEFT JOIN t3 c_alias_1 ON c_alias_1.c1 = a_alias_1.a1
|
||||
LEFT JOIN t4 d_alias_1 ON d_alias_1.d1 = a_alias_1.a1
|
||||
LEFT JOIN t3 c_alias_2 ON c_alias_2.c1 = a_alias_1.a1
|
||||
LEFT JOIN t5 e_alias_1 ON e_alias_1.e1 = a_alias_1.a1
|
||||
LEFT JOIN t6 f_alias_1 ON f_alias_1.f1 = a_alias_1.a1
|
||||
) t7) ON 1=1
|
||||
LEFT OUTER JOIN (( SELECT 1
|
||||
FROM t1 a_alias_1
|
||||
LEFT JOIN (t2 b_alias_1 JOIN t1 a_alias_2) ON b_alias_1.b1 = a_alias_1.a1 AND a_alias_2.a1 = a_alias_1.a1
|
||||
LEFT JOIN t3 c_alias_1 ON c_alias_1.c1 = a_alias_1.a1
|
||||
LEFT JOIN t4 d_alias_1 ON d_alias_1.d1 = a_alias_1.a1
|
||||
LEFT JOIN t3 c_alias_2 ON c_alias_2.c1 = a_alias_1.a1
|
||||
LEFT JOIN t5 e_alias_1 ON e_alias_1.e1 = a_alias_1.a1
|
||||
LEFT JOIN t6 f_alias_1 ON f_alias_1.f1 = a_alias_1.a1
|
||||
) t8) ON 1=1
|
||||
;
|
||||
1
|
||||
SELECT 1
|
||||
FROM (v1 t1)
|
||||
LEFT OUTER JOIN (v1 t2) ON 1=1
|
||||
LEFT OUTER JOIN (v1 t3) ON 1=1
|
||||
LEFT OUTER JOIN (v1 t4) ON 1=1
|
||||
LEFT OUTER JOIN (v1 t5) ON 1=1
|
||||
LEFT OUTER JOIN (v1 t6) ON 1=1
|
||||
LEFT OUTER JOIN (v1 t7) ON 1=1
|
||||
LEFT OUTER JOIN (v1 t8) ON 1=1
|
||||
;
|
||||
1
|
||||
drop view v1;
|
||||
drop table t1,t2,t3,t4,t5,t6;
|
||||
# -----------------------------------------------------------------
|
||||
# -- End of 5.3 tests.
|
||||
# -----------------------------------------------------------------
|
||||
@ -5643,6 +5535,203 @@ View Create View character_set_client collation_connection
|
||||
v1 CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v1` AS select group_concat(`t1`.`str` separator '\\') AS `GROUP_CONCAT(str SEPARATOR '\\')` from `t1` latin1 latin1_swedish_ci
|
||||
drop view v1;
|
||||
drop table t1;
|
||||
CREATE TABLE IF NOT EXISTS t0 (f0 INT);
|
||||
CREATE TABLE IF NOT EXISTS t1 (f1 INT);
|
||||
CREATE TABLE IF NOT EXISTS t2 (f2 INT);
|
||||
CREATE TABLE IF NOT EXISTS t3 (f3 INT);
|
||||
CREATE TABLE IF NOT EXISTS t4 (f4 INT);
|
||||
CREATE TABLE IF NOT EXISTS t5 (f5 INT);
|
||||
CREATE TABLE IF NOT EXISTS t6 (f6 INT);
|
||||
CREATE TABLE IF NOT EXISTS t7 (f7 INT);
|
||||
CREATE TABLE IF NOT EXISTS t8 (f8 INT);
|
||||
CREATE TABLE IF NOT EXISTS t9 (f9 INT);
|
||||
CREATE TABLE IF NOT EXISTS t10 (f10 INT);
|
||||
CREATE TABLE IF NOT EXISTS t11 (f11 INT);
|
||||
CREATE TABLE IF NOT EXISTS t12 (f12 INT);
|
||||
CREATE TABLE IF NOT EXISTS t13 (f13 INT);
|
||||
CREATE TABLE IF NOT EXISTS t14 (f14 INT);
|
||||
CREATE TABLE IF NOT EXISTS t15 (f15 INT);
|
||||
CREATE TABLE IF NOT EXISTS t16 (f16 INT);
|
||||
CREATE TABLE IF NOT EXISTS t17 (f17 INT);
|
||||
CREATE TABLE IF NOT EXISTS t18 (f18 INT);
|
||||
CREATE TABLE IF NOT EXISTS t19 (f19 INT);
|
||||
CREATE TABLE IF NOT EXISTS t20 (f20 INT);
|
||||
CREATE TABLE IF NOT EXISTS t21 (f21 INT);
|
||||
CREATE TABLE IF NOT EXISTS t22 (f22 INT);
|
||||
CREATE TABLE IF NOT EXISTS t23 (f23 INT);
|
||||
CREATE TABLE IF NOT EXISTS t24 (f24 INT);
|
||||
CREATE TABLE IF NOT EXISTS t25 (f25 INT);
|
||||
CREATE TABLE IF NOT EXISTS t26 (f26 INT);
|
||||
CREATE TABLE IF NOT EXISTS t27 (f27 INT);
|
||||
CREATE TABLE IF NOT EXISTS t28 (f28 INT);
|
||||
CREATE TABLE IF NOT EXISTS t29 (f29 INT);
|
||||
CREATE TABLE IF NOT EXISTS t30 (f30 INT);
|
||||
CREATE TABLE IF NOT EXISTS t31 (f31 INT);
|
||||
CREATE TABLE IF NOT EXISTS t32 (f32 INT);
|
||||
CREATE TABLE IF NOT EXISTS t33 (f33 INT);
|
||||
CREATE TABLE IF NOT EXISTS t34 (f34 INT);
|
||||
CREATE TABLE IF NOT EXISTS t35 (f35 INT);
|
||||
CREATE TABLE IF NOT EXISTS t36 (f36 INT);
|
||||
CREATE TABLE IF NOT EXISTS t37 (f37 INT);
|
||||
CREATE TABLE IF NOT EXISTS t38 (f38 INT);
|
||||
CREATE TABLE IF NOT EXISTS t39 (f39 INT);
|
||||
CREATE TABLE IF NOT EXISTS t40 (f40 INT);
|
||||
CREATE TABLE IF NOT EXISTS t41 (f41 INT);
|
||||
CREATE TABLE IF NOT EXISTS t42 (f42 INT);
|
||||
CREATE TABLE IF NOT EXISTS t43 (f43 INT);
|
||||
CREATE TABLE IF NOT EXISTS t44 (f44 INT);
|
||||
CREATE TABLE IF NOT EXISTS t45 (f45 INT);
|
||||
CREATE TABLE IF NOT EXISTS t46 (f46 INT);
|
||||
CREATE TABLE IF NOT EXISTS t47 (f47 INT);
|
||||
CREATE TABLE IF NOT EXISTS t48 (f48 INT);
|
||||
CREATE TABLE IF NOT EXISTS t49 (f49 INT);
|
||||
CREATE TABLE IF NOT EXISTS t50 (f50 INT);
|
||||
CREATE TABLE IF NOT EXISTS t51 (f51 INT);
|
||||
CREATE TABLE IF NOT EXISTS t52 (f52 INT);
|
||||
CREATE TABLE IF NOT EXISTS t53 (f53 INT);
|
||||
CREATE TABLE IF NOT EXISTS t54 (f54 INT);
|
||||
CREATE TABLE IF NOT EXISTS t55 (f55 INT);
|
||||
CREATE TABLE IF NOT EXISTS t56 (f56 INT);
|
||||
CREATE TABLE IF NOT EXISTS t57 (f57 INT);
|
||||
CREATE TABLE IF NOT EXISTS t58 (f58 INT);
|
||||
CREATE TABLE IF NOT EXISTS t59 (f59 INT);
|
||||
CREATE TABLE IF NOT EXISTS t60 (f60 INT);
|
||||
CREATE OR REPLACE VIEW v60 AS SELECT * FROM t60;
|
||||
EXPLAIN
|
||||
SELECT t0.*
|
||||
FROM t0
|
||||
JOIN t1
|
||||
ON t1.f1 = t0.f0
|
||||
LEFT JOIN t2
|
||||
ON t0.f0 = t2.f2
|
||||
LEFT JOIN t3
|
||||
ON t0.f0 = t3.f3
|
||||
LEFT JOIN t4
|
||||
ON t0.f0 = t4.f4
|
||||
LEFT JOIN t5
|
||||
ON t4.f4 = t5.f5
|
||||
LEFT JOIN t6
|
||||
ON t0.f0 = t6.f6
|
||||
LEFT JOIN t7
|
||||
ON t0.f0 = t7.f7
|
||||
LEFT JOIN t8
|
||||
ON t0.f0 = t8.f8
|
||||
LEFT JOIN t9
|
||||
ON t0.f0 = t9.f9
|
||||
LEFT JOIN t10
|
||||
ON t0.f0 = t10.f10
|
||||
LEFT JOIN t11
|
||||
ON t0.f0 = t11.f11
|
||||
LEFT JOIN t12
|
||||
ON t0.f0 = t12.f12
|
||||
LEFT JOIN t13
|
||||
ON t0.f0 = t13.f13
|
||||
LEFT JOIN t14
|
||||
ON t0.f0 = t14.f14
|
||||
LEFT JOIN t15
|
||||
ON t0.f0 = t15.f15
|
||||
LEFT JOIN t16
|
||||
ON t0.f0 = t16.f16
|
||||
LEFT JOIN t17
|
||||
ON t0.f0 = t17.f17
|
||||
LEFT JOIN t18
|
||||
ON t0.f0 = t18.f18
|
||||
LEFT JOIN t19
|
||||
ON t18.f18 = t19.f19
|
||||
LEFT JOIN t20
|
||||
ON t20.f20 = t19.f19
|
||||
LEFT JOIN t21
|
||||
ON t20.f20 = t21.f21
|
||||
LEFT JOIN t22
|
||||
ON t19.f19 = t22.f22
|
||||
LEFT JOIN t23
|
||||
ON t23.f23 = t0.f0
|
||||
LEFT JOIN t24
|
||||
ON t24.f24 = t23.f23
|
||||
LEFT JOIN t25
|
||||
ON t0.f0 = t25.f25
|
||||
LEFT JOIN t26
|
||||
ON t26.f26 = t0.f0
|
||||
LEFT JOIN t27
|
||||
ON t27.f27 = t0.f0
|
||||
LEFT JOIN t28
|
||||
ON t0.f0 = t28.f28
|
||||
LEFT JOIN t29
|
||||
ON t0.f0 = t29.f29
|
||||
LEFT JOIN t30
|
||||
ON t30.f30 = t0.f0
|
||||
LEFT JOIN t31
|
||||
ON t0.f0 = t31.f31
|
||||
LEFT JOIN t32
|
||||
ON t32.f32 = t31.f31
|
||||
LEFT JOIN t33
|
||||
ON t33.f33 = t0.f0
|
||||
LEFT JOIN t34
|
||||
ON t33.f33 = t34.f34
|
||||
LEFT JOIN t35
|
||||
ON t33.f33 = t35.f35
|
||||
LEFT JOIN t36
|
||||
ON t36.f36 = t0.f0
|
||||
LEFT JOIN t37
|
||||
ON t32.f32 = t37.f37
|
||||
LEFT JOIN t38
|
||||
ON t31.f31 = t38.f38
|
||||
LEFT JOIN t39
|
||||
ON t39.f39 = t0.f0
|
||||
LEFT JOIN t40
|
||||
ON t40.f40 = t39.f39
|
||||
LEFT JOIN t41
|
||||
ON t41.f41 = t0.f0
|
||||
LEFT JOIN t42
|
||||
ON t42.f42 = t41.f41
|
||||
LEFT JOIN t43
|
||||
ON t43.f43 = t41.f41
|
||||
LEFT JOIN t44
|
||||
ON t44.f44 = t0.f0
|
||||
LEFT JOIN t45
|
||||
ON t45.f45 = t0.f0
|
||||
LEFT JOIN t46
|
||||
ON t46.f46 = t0.f0
|
||||
LEFT JOIN t47
|
||||
ON t47.f47 = t0.f0
|
||||
LEFT JOIN t48
|
||||
ON t48.f48 = t0.f0
|
||||
LEFT JOIN t49
|
||||
ON t0.f0 = t49.f49
|
||||
LEFT JOIN t50
|
||||
ON t0.f0 = t50.f50
|
||||
LEFT JOIN t51
|
||||
ON t0.f0 = t51.f51
|
||||
LEFT JOIN t52
|
||||
ON t52.f52 = t0.f0
|
||||
LEFT JOIN t53
|
||||
ON t53.f53 = t0.f0
|
||||
LEFT JOIN t54
|
||||
ON t54.f54 = t0.f0
|
||||
LEFT JOIN t55
|
||||
ON t55.f55 = t0.f0
|
||||
LEFT JOIN t56
|
||||
ON t56.f56 = t0.f0
|
||||
LEFT JOIN t57
|
||||
ON t57.f57 = t0.f0
|
||||
LEFT JOIN t58
|
||||
ON t58.f58 = t57.f57
|
||||
LEFT JOIN t59
|
||||
ON t36.f36 = t59.f59
|
||||
LEFT JOIN v60
|
||||
ON t36.f36 = v60.f60
|
||||
;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Impossible WHERE noticed after reading const tables
|
||||
2 SUBQUERY NULL NULL NULL NULL NULL NULL NULL no matching row in const table
|
||||
drop table t0, t1, t2, t3, t4, t5, t6, t7, t8, t9,
|
||||
t10, t11, t12, t13, t14, t15, t16, t17, t18,
|
||||
t19, t20, t21, t22, t23, t24, t25, t26, t27,
|
||||
t28, t29, t30, t31, t32, t33, t34, t35, t36,
|
||||
t37, t38, t39, t40, t41, t42, t43, t44, t45,
|
||||
t46, t47, t48, t49, t50, t51, t52, t53, t54,
|
||||
t55, t56, t57, t58, t59,t60;
|
||||
drop view v60;
|
||||
# -----------------------------------------------------------------
|
||||
# -- End of 5.5 tests.
|
||||
# -----------------------------------------------------------------
|
||||
|
@ -4,10 +4,11 @@
|
||||
create table t1 (f1 int primary key, f2 int, f3 int, unique key k1(f2),
|
||||
key k2(f3)) engine=innodb;
|
||||
insert into t1 values (14, 24, 34);
|
||||
set @@debug_dbug = '+d,row_ins_sec_index_entry_timeout';
|
||||
set @old_dbug= @@session.debug_dbug;
|
||||
set debug_dbug = '+d,row_ins_sec_index_entry_timeout';
|
||||
replace into t1 values (14, 25, 34);
|
||||
select * from t1;
|
||||
f1 f2 f3
|
||||
14 25 34
|
||||
drop table t1;
|
||||
set @@debug_dbug = '-d,row_ins_sec_index_entry_timeout';
|
||||
set debug_dbug = @old_dbug;
|
||||
|
@ -1,3 +1,5 @@
|
||||
create temporary table t (a char(1) character set filename) engine=innodb;
|
||||
drop temporary table t;
|
||||
set optimizer_switch = 'mrr=on,mrr_sort_keys=on,index_condition_pushdown=on';
|
||||
drop table if exists t1,t2,t3,t4;
|
||||
drop database if exists mysqltest;
|
||||
|
24
mysql-test/suite/innodb/r/innodb_bug27216817.result
Normal file
24
mysql-test/suite/innodb/r/innodb_bug27216817.result
Normal file
@ -0,0 +1,24 @@
|
||||
create table t1 (a int not null, b int not null) engine=innodb;
|
||||
insert t1 values (1,2),(3,4);
|
||||
lock table t1 write, t1 tr read;
|
||||
flush status;
|
||||
alter table t1 add primary key (b);
|
||||
show status like 'Handler_read_rnd_next';
|
||||
Variable_name Value
|
||||
Handler_read_rnd_next 3
|
||||
unlock tables;
|
||||
alter table t1 drop primary key;
|
||||
lock table t1 write;
|
||||
flush status;
|
||||
alter table t1 add primary key (b);
|
||||
show status like 'Handler_read_rnd_next';
|
||||
Variable_name Value
|
||||
Handler_read_rnd_next 0
|
||||
unlock tables;
|
||||
alter table t1 drop primary key;
|
||||
flush status;
|
||||
alter table t1 add primary key (b);
|
||||
show status like 'Handler_read_rnd_next';
|
||||
Variable_name Value
|
||||
Handler_read_rnd_next 0
|
||||
drop table t1;
|
@ -1,27 +1,63 @@
|
||||
set names utf8;
|
||||
SET UNIQUE_CHECKS=0;
|
||||
CREATE TABLE corrupt_bit_test_ā(
|
||||
a INT AUTO_INCREMENT PRIMARY KEY,
|
||||
b CHAR(100),
|
||||
c INT,
|
||||
z INT,
|
||||
INDEX idx(b))
|
||||
ENGINE=InnoDB;
|
||||
INSERT INTO corrupt_bit_test_ā VALUES(0,'x',1, 1);
|
||||
CREATE UNIQUE INDEX idxā ON corrupt_bit_test_ā(c, b);
|
||||
CREATE UNIQUE INDEX idxē ON corrupt_bit_test_ā(z, b);
|
||||
SELECT * FROM corrupt_bit_test_ā;
|
||||
a b c z
|
||||
1 x 1 1
|
||||
INSERT INTO corrupt_bit_test_ā SELECT 0,b,c+1,z+1 FROM corrupt_bit_test_ā;
|
||||
select count(*) from corrupt_bit_test_ā;
|
||||
count(*)
|
||||
2
|
||||
SET @save_dbug = @@SESSION.debug_dbug;
|
||||
SET debug_dbug = '+d,dict_set_index_corrupted';
|
||||
check table corrupt_bit_test_ā;
|
||||
Table Op Msg_type Msg_text
|
||||
test.corrupt_bit_test_ā check Warning InnoDB: Index "idx" is marked as corrupted
|
||||
test.corrupt_bit_test_ā check Warning InnoDB: Index "idxā" is marked as corrupted
|
||||
test.corrupt_bit_test_ā check Warning InnoDB: Index "idxē" is marked as corrupted
|
||||
test.corrupt_bit_test_ā check error Corrupt
|
||||
SET debug_dbug = @save_dbug;
|
||||
CREATE INDEX idx3 ON corrupt_bit_test_ā(b, c);
|
||||
ERROR HY000: Index corrupt_bit_test_ā is corrupted
|
||||
CREATE INDEX idx4 ON corrupt_bit_test_ā(b, z);
|
||||
ERROR HY000: Index corrupt_bit_test_ā is corrupted
|
||||
select c from corrupt_bit_test_ā;
|
||||
ERROR HY000: Index corrupt_bit_test_ā is corrupted
|
||||
select z from corrupt_bit_test_ā;
|
||||
ERROR HY000: Index corrupt_bit_test_ā is corrupted
|
||||
show warnings;
|
||||
Level Code Message
|
||||
Warning 179 InnoDB: Index "idxē" for table "test"."corrupt_bit_test_ā" is marked as corrupted
|
||||
Warning 179 Got error 179 when reading table `test`.`corrupt_bit_test_ā`
|
||||
Error 1712 Index corrupt_bit_test_ā is corrupted
|
||||
insert into corrupt_bit_test_ā values (10001, "a", 20001, 20001);
|
||||
select * from corrupt_bit_test_ā use index(primary) where a = 10001;
|
||||
a b c z
|
||||
10001 a 20001 20001
|
||||
begin;
|
||||
insert into corrupt_bit_test_ā values (10002, "a", 20002, 20002);
|
||||
delete from corrupt_bit_test_ā where a = 10001;
|
||||
insert into corrupt_bit_test_ā values (10001, "a", 20001, 20001);
|
||||
rollback;
|
||||
drop index idxā on corrupt_bit_test_ā;
|
||||
check table corrupt_bit_test_ā;
|
||||
Table Op Msg_type Msg_text
|
||||
test.corrupt_bit_test_ā check Warning InnoDB: Index "idx" is marked as corrupted
|
||||
test.corrupt_bit_test_ā check Warning InnoDB: Index "idxē" is marked as corrupted
|
||||
test.corrupt_bit_test_ā check error Corrupt
|
||||
set names utf8;
|
||||
select z from corrupt_bit_test_ā;
|
||||
ERROR HY000: Index corrupt_bit_test_ā is corrupted
|
||||
show create table corrupt_bit_test_ā;
|
||||
Table Create Table
|
||||
corrupt_bit_test_ā CREATE TABLE `corrupt_bit_test_ā` (
|
||||
`a` int(11) NOT NULL AUTO_INCREMENT,
|
||||
@ -32,8 +68,12 @@ corrupt_bit_test_ā CREATE TABLE `corrupt_bit_test_ā` (
|
||||
UNIQUE KEY `idxē` (`z`,`b`),
|
||||
KEY `idx` (`b`)
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=10003 DEFAULT CHARSET=latin1
|
||||
drop index idxē on corrupt_bit_test_ā;
|
||||
CREATE INDEX idx3 ON corrupt_bit_test_ā(b, c);
|
||||
ERROR HY000: Index corrupt_bit_test_ā is corrupted
|
||||
CREATE INDEX idx4 ON corrupt_bit_test_ā(b, z);
|
||||
ERROR HY000: Index corrupt_bit_test_ā is corrupted
|
||||
show create table corrupt_bit_test_ā;
|
||||
Table Create Table
|
||||
corrupt_bit_test_ā CREATE TABLE `corrupt_bit_test_ā` (
|
||||
`a` int(11) NOT NULL AUTO_INCREMENT,
|
||||
@ -43,7 +83,12 @@ corrupt_bit_test_ā CREATE TABLE `corrupt_bit_test_ā` (
|
||||
PRIMARY KEY (`a`),
|
||||
KEY `idx` (`b`)
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=10003 DEFAULT CHARSET=latin1
|
||||
drop index idx on corrupt_bit_test_ā;
|
||||
CREATE INDEX idx3 ON corrupt_bit_test_ā(b, c);
|
||||
CREATE INDEX idx4 ON corrupt_bit_test_ā(b, z);
|
||||
select z from corrupt_bit_test_ā limit 10;
|
||||
z
|
||||
20001
|
||||
1
|
||||
2
|
||||
drop table corrupt_bit_test_ā;
|
||||
|
@ -8,8 +8,9 @@
|
||||
create table t1 (f1 int primary key, f2 int, f3 int, unique key k1(f2),
|
||||
key k2(f3)) engine=innodb;
|
||||
insert into t1 values (14, 24, 34);
|
||||
set @@debug_dbug = '+d,row_ins_sec_index_entry_timeout';
|
||||
set @old_dbug= @@session.debug_dbug;
|
||||
set debug_dbug = '+d,row_ins_sec_index_entry_timeout';
|
||||
replace into t1 values (14, 25, 34);
|
||||
select * from t1;
|
||||
drop table t1;
|
||||
set @@debug_dbug = '-d,row_ins_sec_index_entry_timeout';
|
||||
set debug_dbug = @old_dbug;
|
||||
|
@ -1,23 +1,11 @@
|
||||
#######################################################################
|
||||
# #
|
||||
# Please, DO NOT TOUCH this file as well as the innodb.result file. #
|
||||
# These files are to be modified ONLY BY INNOBASE guys. #
|
||||
# #
|
||||
# Use innodb_mysql.[test|result] files instead. #
|
||||
# #
|
||||
# If nevertheless you need to make some changes here, please, forward #
|
||||
# your commit message #
|
||||
# To: innodb_dev_ww@oracle.com #
|
||||
# Cc: dev-innodb@mysql.com #
|
||||
# (otherwise your changes may be erased). #
|
||||
# #
|
||||
#######################################################################
|
||||
|
||||
-- source include/have_innodb.inc
|
||||
let $MYSQLD_DATADIR= `select @@datadir`;
|
||||
let collation=utf8_unicode_ci;
|
||||
--source include/have_collation.inc
|
||||
|
||||
create temporary table t (a char(1) character set filename) engine=innodb;
|
||||
drop temporary table t;
|
||||
|
||||
set optimizer_switch = 'mrr=on,mrr_sort_keys=on,index_condition_pushdown=on';
|
||||
|
||||
# Save the original values of some variables in order to be able to
|
||||
@ -2546,18 +2534,3 @@ show status like "handler_read_key";
|
||||
select f1 from t1;
|
||||
show status like "handler_read_key";
|
||||
drop table t1;
|
||||
|
||||
#######################################################################
|
||||
# #
|
||||
# Please, DO NOT TOUCH this file as well as the innodb.result file. #
|
||||
# These files are to be modified ONLY BY INNOBASE guys. #
|
||||
# #
|
||||
# Use innodb_mysql.[test|result] files instead. #
|
||||
# #
|
||||
# If nevertheless you need to make some changes here, please, forward #
|
||||
# your commit message #
|
||||
# To: innodb_dev_ww@oracle.com #
|
||||
# Cc: dev-innodb@mysql.com #
|
||||
# (otherwise your changes may be erased). #
|
||||
# #
|
||||
#######################################################################
|
||||
|
28
mysql-test/suite/innodb/t/innodb_bug27216817.test
Normal file
28
mysql-test/suite/innodb/t/innodb_bug27216817.test
Normal file
@ -0,0 +1,28 @@
|
||||
#
|
||||
# BUG#27216817: INNODB: FAILING ASSERTION:
|
||||
# PREBUILT->TABLE->N_MYSQL_HANDLES_OPENED == 1
|
||||
#
|
||||
|
||||
source include/have_innodb.inc;
|
||||
create table t1 (a int not null, b int not null) engine=innodb;
|
||||
insert t1 values (1,2),(3,4);
|
||||
|
||||
lock table t1 write, t1 tr read;
|
||||
flush status;
|
||||
alter table t1 add primary key (b);
|
||||
show status like 'Handler_read_rnd_next';
|
||||
unlock tables;
|
||||
alter table t1 drop primary key;
|
||||
|
||||
lock table t1 write;
|
||||
flush status;
|
||||
alter table t1 add primary key (b);
|
||||
show status like 'Handler_read_rnd_next';
|
||||
unlock tables;
|
||||
alter table t1 drop primary key;
|
||||
|
||||
flush status;
|
||||
alter table t1 add primary key (b);
|
||||
show status like 'Handler_read_rnd_next';
|
||||
|
||||
drop table t1;
|
@ -8,6 +8,7 @@
|
||||
|
||||
-- disable_query_log
|
||||
call mtr.add_suppression("Flagged corruption of idx.*in CHECK TABLE");
|
||||
-- enable_query_log
|
||||
|
||||
set names utf8;
|
||||
|
||||
@ -36,9 +37,10 @@ INSERT INTO corrupt_bit_test_ā SELECT 0,b,c+1,z+1 FROM corrupt_bit_test_ā;
|
||||
select count(*) from corrupt_bit_test_ā;
|
||||
|
||||
# This will flag all secondary indexes corrupted
|
||||
SET SESSION debug_dbug="+d,dict_set_index_corrupted";
|
||||
SET @save_dbug = @@SESSION.debug_dbug;
|
||||
SET debug_dbug = '+d,dict_set_index_corrupted';
|
||||
check table corrupt_bit_test_ā;
|
||||
SET SESSION debug_dbug="-d,dict_set_index_corrupted";
|
||||
SET debug_dbug = @save_dbug;
|
||||
|
||||
# Cannot create new indexes while corrupted indexes exist
|
||||
--error ER_INDEX_CORRUPT
|
||||
|
4
mysql-test/suite/maria/dynamic.result
Normal file
4
mysql-test/suite/maria/dynamic.result
Normal file
@ -0,0 +1,4 @@
|
||||
create table t1 (a blob, b varchar(20000)) engine=aria row_format=dynamic;
|
||||
insert t1 (b) values (repeat('a', 20000));
|
||||
update t1 set b='b';
|
||||
drop table t1;
|
7
mysql-test/suite/maria/dynamic.test
Normal file
7
mysql-test/suite/maria/dynamic.test
Normal file
@ -0,0 +1,7 @@
|
||||
#
|
||||
# MDEV-13748 Assertion `status_var.local_memory_used == 0 || !debug_assert_on_not_freed_memory' failed in virtual THD::~THD after query with INTERSECT
|
||||
#
|
||||
create table t1 (a blob, b varchar(20000)) engine=aria row_format=dynamic;
|
||||
insert t1 (b) values (repeat('a', 20000));
|
||||
update t1 set b='b';
|
||||
drop table t1;
|
@ -16,6 +16,15 @@ select * from t1;
|
||||
pk dt
|
||||
1 2017-09-28 15:12:00
|
||||
drop table t1;
|
||||
create table t1 (a int) engine=Aria transactional=1 partition by hash(a) partitions 2;
|
||||
show create table t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`a` int(11) DEFAULT NULL
|
||||
) ENGINE=Aria DEFAULT CHARSET=latin1 TRANSACTIONAL=1
|
||||
/*!50100 PARTITION BY HASH (a)
|
||||
PARTITIONS 2 */
|
||||
drop table t1;
|
||||
#
|
||||
# MDEV-13788 Server crash when issuing bad SQL partition syntax
|
||||
#
|
||||
|
@ -17,5 +17,12 @@ alter table t1 drop partition p20181231;
|
||||
select * from t1;
|
||||
drop table t1;
|
||||
|
||||
#
|
||||
# MDEV-13982 Server crashes in in ha_partition::engine_name
|
||||
#
|
||||
create table t1 (a int) engine=Aria transactional=1 partition by hash(a) partitions 2;
|
||||
show create table t1;
|
||||
drop table t1;
|
||||
|
||||
--let $engine=Aria
|
||||
--source inc/part_alter_values.inc
|
||||
|
@ -42,8 +42,10 @@ select 1,
|
||||
3;
|
||||
insert into t2 values (1), (2);
|
||||
select * from t2;
|
||||
--disable_ps_protocol
|
||||
--error ER_NO_SUCH_TABLE
|
||||
select * from t_doesnt_exist;
|
||||
--enable_ps_protocol
|
||||
--error 1064
|
||||
syntax_error_query;
|
||||
drop table renamed_t1, t2;
|
||||
|
@ -885,6 +885,28 @@ DESCRIBE t1;
|
||||
DROP TABLE t1;
|
||||
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-15624 Changing the default character set to utf8mb4 changes query evaluation in a very surprising way
|
||||
--echo #
|
||||
|
||||
SET NAMES utf8;
|
||||
CREATE TABLE t1 (id INT);
|
||||
INSERT INTO t1 VALUES (1),(2),(3);
|
||||
|
||||
SELECT COUNT(DISTINCT c) FROM (SELECT id, REPLACE(uuid_short(), '0', CAST('o' AS CHAR CHARACTER SET ucs2)) AS c FROM t1) AS d1;
|
||||
--replace_column 1 xxxxxxxxxxxxxxxxx
|
||||
SELECT DISTINCT REPLACE(uuid_short(), '0', CAST('o' AS CHAR CHARACTER SET ucs2)) AS c FROM t1;
|
||||
|
||||
SELECT COUNT(DISTINCT c) FROM (SELECT id, INSERT(uuid_short(), 1, 1, CAST('0' AS CHAR CHARACTER SET ucs2)) AS c FROM t1) AS d1;
|
||||
--replace_column 1 xxxxxxxxxxxxxxxxx
|
||||
SELECT DISTINCT INSERT(uuid_short(), 1, 1, CAST('0' AS CHAR CHARACTER SET ucs2)) AS c FROM t1;
|
||||
|
||||
SELECT COUNT(DISTINCT c) FROM (SELECT id, CONCAT(uuid_short(), CAST('0' AS CHAR CHARACTER SET ucs2)) AS c FROM t1) AS d1;
|
||||
--replace_column 1 xxxxxxxxxxxxxxxxx
|
||||
SELECT DISTINCT CONCAT(uuid_short(), CAST('0' AS CHAR CHARACTER SET ucs2)) AS c FROM t1;
|
||||
DROP TABLE t1;
|
||||
|
||||
|
||||
--echo #
|
||||
--echo # End of 5.5 tests
|
||||
--echo #
|
||||
|
@ -1858,6 +1858,25 @@ SELECT LENGTH(data) AS len FROM (SELECT REPEAT('☃', 21846) AS data ) AS sub;
|
||||
SELECT LENGTH(data) AS len FROM (SELECT REPEAT('☃', 65535) AS data ) AS sub;
|
||||
SELECT LENGTH(data) AS len FROM (SELECT REPEAT('☃', 65536) AS data ) AS sub;
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-15624 Changing the default character set to utf8mb4 changes query evaluation in a very surprising way
|
||||
--echo #
|
||||
|
||||
SET NAMES utf8mb4;
|
||||
CREATE TABLE t1 (id INT);
|
||||
INSERT INTO t1 VALUES (1),(2),(3);
|
||||
|
||||
SELECT COUNT(DISTINCT c) FROM (SELECT id, REPLACE(UUID(), "-", "") AS c FROM t1) AS d1;
|
||||
--replace_column 1 xxxxxxxxxxxxx-xxxx-xxxx-xxxxxxxxxxxx
|
||||
SELECT DISTINCT INSERT(uuid(), 9, 1, "X") AS c FROM t1;
|
||||
|
||||
SELECT COUNT(DISTINCT c) FROM (SELECT id, INSERT(UUID(), 9, 1, "X") AS c FROM t1) AS d1;
|
||||
--replace_column 1 xxxxxxxxxxxxx-xxxx-xxxx-xxxxxxxxxxxx
|
||||
SELECT DISTINCT INSERT(UUID(), 9, 1, "X") AS c FROM t1;
|
||||
|
||||
DROP TABLE t1;
|
||||
|
||||
|
||||
--echo #
|
||||
--echo # End of 5.5 tests
|
||||
--echo #
|
||||
|
@ -864,5 +864,43 @@ select distinct t1.id, tt.id, tt.data
|
||||
|
||||
drop table t1;
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-14241: Server crash in key_copy / get_matching_chain_by_join_key
|
||||
--echo # or valgrind warnings
|
||||
--echo #
|
||||
|
||||
CREATE TABLE t1 (a VARCHAR(10)) ENGINE=MyISAM;
|
||||
CREATE OR REPLACE ALGORITHM=TEMPTABLE VIEW v1 AS SELECT * FROM t1;
|
||||
INSERT INTO t1 VALUES ('foo'),('bar');
|
||||
|
||||
CREATE TABLE t2 (b integer auto_increment primary key) ENGINE=MyISAM;
|
||||
INSERT INTO t2 VALUES (NULL),(NULL);
|
||||
|
||||
CREATE TABLE t3 (c VARCHAR(1024) CHARACTER SET utf8, d INT) ENGINE=MyISAM;
|
||||
CREATE OR REPLACE ALGORITHM=TEMPTABLE VIEW v3 AS SELECT * FROM t3;
|
||||
INSERT INTO t3 VALUES ('abc',NULL),('def',4);
|
||||
|
||||
SET join_cache_level= 8;
|
||||
explain
|
||||
SELECT * FROM v1, t2, v3 WHERE a = c AND b = d;
|
||||
SELECT * FROM v1, t2, v3 WHERE a = c AND b = d;
|
||||
|
||||
DROP VIEW v1, v3;
|
||||
DROP TABLE t1, t2, t3;
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-14786: Server crashes in Item_cond::transform on 2nd
|
||||
--echo # execution of SP querying from a view
|
||||
--echo #
|
||||
create table t1 (i int, row_start timestamp(6) not null default now(),
|
||||
row_end timestamp(6) not null default '2030-01-01 0:0:0');
|
||||
create view v1 as select i from t1 where i < 5 and (row_end =
|
||||
TIMESTAMP'2030-01-01 0:0:0' or row_end is null);
|
||||
create procedure pr(x int) select i from v1;
|
||||
call pr(1);
|
||||
call pr(2);
|
||||
drop procedure pr;
|
||||
drop view v1;
|
||||
drop table t1;
|
||||
|
||||
--echo # end of 5.5
|
||||
|
@ -596,6 +596,18 @@ AND 57813X540X1723 = 'Test';
|
||||
|
||||
drop table t1;
|
||||
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-15630 uuid() function evaluates at wrong time in query
|
||||
--echo #
|
||||
|
||||
CREATE TABLE t1 (id INT);
|
||||
INSERT INTO t1 VALUES (1),(2),(3);
|
||||
--replace_column 2 xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
|
||||
SELECT COUNT(1), UUID() as uid FROM t1 GROUP BY uid;
|
||||
DROP TABLE t1;
|
||||
|
||||
|
||||
--echo #
|
||||
--echo # End of 5.5 tests
|
||||
--echo #
|
||||
|
@ -3791,5 +3791,50 @@ set join_cache_level = default;
|
||||
|
||||
DROP TABLE t1,t2;
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-14960: BNLH used for materialized semi-join
|
||||
--echo #
|
||||
|
||||
CREATE TABLE t1 (i1 int);
|
||||
CREATE TABLE t2 (e1 int);
|
||||
CREATE TABLE t4 (e1 int);
|
||||
CREATE TABLE t5 (e1 int);
|
||||
|
||||
INSERT INTO t1 VALUES
|
||||
(1),(2),(3),(4),(5),(6),(7),(8);
|
||||
INSERT INTO t1 SELECT i1+8 FROM t1;
|
||||
INSERT INTO t1 SELECT i1+16 FROM t1;
|
||||
INSERT INTO t1 SELECT i1+32 FROM t1;
|
||||
INSERT INTO t1 SELECT i1+64 FROM t1;
|
||||
INSERT INTO t2 SELECT * FROM t1;
|
||||
INSERT INTO t4 SELECT * FROM t1;
|
||||
INSERT INTO t5 SELECT * FROM t1;
|
||||
|
||||
set @save_optimizer_switch= @@optimizer_switch;
|
||||
SET join_cache_level = 6;
|
||||
SET join_buffer_size=4096;
|
||||
SET join_buffer_space_limit=4096;
|
||||
SET optimizer_switch = 'join_cache_hashed=on,optimize_join_buffer_size=on';
|
||||
|
||||
let $q=
|
||||
SELECT * FROM t1
|
||||
WHERE
|
||||
i1 < 10 AND
|
||||
i1 IN
|
||||
(SELECT i1 FROM
|
||||
(SELECT (t4.e1) i1 FROM t4
|
||||
LEFT JOIN t5 ON t4.e1 = t5.e1
|
||||
LEFT JOIN (SELECT e1 FROM t2 ) AS d ON t4.e1 = d.e1) a);
|
||||
|
||||
eval EXPLAIN $q;
|
||||
eval $q;
|
||||
|
||||
SET join_cache_level = default;
|
||||
SET join_buffer_size = default;
|
||||
SET join_buffer_space_limit= default;
|
||||
set optimizer_switch=@save_optimizer_switch;
|
||||
|
||||
DROP TABLE t1,t4,t5,t2;
|
||||
|
||||
# this must be the last command in the file
|
||||
set @@optimizer_switch=@save_optimizer_switch;
|
||||
|
@ -1891,9 +1891,25 @@ INSERT INTO t1 VALUES (0),(1);
|
||||
CREATE TABLE t2 (b2 BIT NOT NULL);
|
||||
INSERT INTO t2 VALUES (0),(1);
|
||||
|
||||
SET SESSION JOIN_CACHE_LEVEL = 3;
|
||||
set @save_join_cache_level= @@join_cache_level;
|
||||
SET @@join_cache_level = 3;
|
||||
SELECT t1.b1+'0' , t2.b2 + '0' FROM t1 LEFT JOIN t2 ON b1 = b2;
|
||||
DROP TABLE t1, t2;
|
||||
set @join_cache_level= @save_join_cache_level;
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-14779: using left join causes incorrect results with materialization and derived tables
|
||||
--echo #
|
||||
|
||||
create table t1(id int);
|
||||
insert into t1 values (1),(2);
|
||||
create table t2(sid int, id int);
|
||||
insert into t2 values (1,1),(2,2);
|
||||
|
||||
select * from t1 t
|
||||
left join (select * from t2 where sid in (select max(sid) from t2 where 0=1 group by id)) r
|
||||
on t.id=r.id ;
|
||||
drop table t1, t2;
|
||||
|
||||
--echo # end of 5.5 tests
|
||||
|
||||
|
27
mysql-test/t/mdev_14586.test
Normal file
27
mysql-test/t/mdev_14586.test
Normal file
@ -0,0 +1,27 @@
|
||||
create table t1(a bit(1), b int auto_increment ,id int, index(a,b));
|
||||
insert into t1 values(1,null,1);
|
||||
insert into t1 values(1,null,2);
|
||||
insert into t1 values(0,null,3);
|
||||
insert into t1 values(0,null,4);
|
||||
select a+0, b as auto_increment , id from t1 order by id;
|
||||
drop table t1;
|
||||
create table t1(a int auto_increment, b bit(5) ,id int, index (b,a));
|
||||
insert into t1 values(null,b'1',1);
|
||||
insert into t1 values(null,b'1',2);
|
||||
insert into t1 values(null,b'11',3);
|
||||
insert into t1 values(null,b'11',4);
|
||||
select a as auto_increment, b+0, id from t1 order by id;
|
||||
drop table t1;
|
||||
create table t1(a bit(1), b int auto_increment , c bit(1) , d bit(1), id int,index(a,c,b,d));
|
||||
insert into t1 values(1,null,1,1,1);
|
||||
insert into t1 values(1,null,1,1,2);
|
||||
insert into t1 values(0,null,1,1,3);
|
||||
insert into t1 values(1,null,0,1,4);
|
||||
select a+0, b as auto_increment, c+0, d+0, id from t1 order by id;
|
||||
drop table t1;
|
||||
CREATE TABLE t1 (b BIT(1), pk INTEGER AUTO_INCREMENT PRIMARY KEY);
|
||||
ALTER TABLE t1 ADD INDEX(b,pk);
|
||||
INSERT INTO t1 VALUES (1,b'1');
|
||||
ALTER TABLE t1 DROP PRIMARY KEY;
|
||||
select b+0, pk as auto_increment from t1;
|
||||
DROP TABLE t1;
|
@ -36,3 +36,23 @@ show tables from `mysqltest1
|
||||
|
||||
drop database `mysqltest1
|
||||
1tsetlqsym`;
|
||||
|
||||
create database `test```;
|
||||
create database `test\``
|
||||
\! ls
|
||||
#`;
|
||||
|
||||
show databases like 'test%';
|
||||
|
||||
exec $MYSQL_DUMP --compact --comment --add-drop-database --databases 'test`' 'test\`
|
||||
\! ls
|
||||
#';
|
||||
|
||||
exec $MYSQL_DUMP --compact --comment --add-drop-database --databases 'test`' 'test\`
|
||||
\! ls
|
||||
#' | $MYSQL;
|
||||
|
||||
drop database `test```;
|
||||
drop database `test\``
|
||||
\! ls
|
||||
#`;
|
||||
|
@ -780,3 +780,12 @@ CREATE TRIGGER tr AFTER DELETE ON t1 FOR EACH ROW SET @a = 1\;
|
||||
--error ER_PARSE_ERROR
|
||||
PREPARE stmt FROM 'CREATE TRIGGER tr AFTER DELETE ON t1 FOR EACH ROW SET @a = 1\\';
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-15620 Crash when using "SET @@NEW.a=expr" inside a trigger
|
||||
--echo #
|
||||
|
||||
CREATE TABLE t1 (a INT);
|
||||
--error ER_UNKNOWN_SYSTEM_VARIABLE
|
||||
CREATE TRIGGER tr1 BEFORE INSERT ON t1 FOR EACH ROW SET @@NEW.a=0;
|
||||
DROP TABLE t1;
|
||||
|
35
mysql-test/t/ps_qc_innodb.test
Normal file
35
mysql-test/t/ps_qc_innodb.test
Normal file
@ -0,0 +1,35 @@
|
||||
--source include/have_query_cache.inc
|
||||
--source include/have_innodb.inc
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-15492: Subquery crash similar to MDEV-10050
|
||||
--echo #
|
||||
|
||||
SET @qcs.save= @@global.query_cache_size, @qct.save= @@global.query_cache_type;
|
||||
SET GLOBAL query_cache_size= 512*1024*1024, query_cache_type= ON;
|
||||
|
||||
--connect (con1,localhost,root,,test)
|
||||
CREATE TABLE t1 (a INT) ENGINE=InnoDB;
|
||||
CREATE TABLE t2 (b INT) ENGINE=InnoDB;
|
||||
CREATE VIEW v AS select a from t1 join t2;
|
||||
|
||||
PREPARE stmt1 FROM "SELECT * FROM t1 WHERE a in (SELECT a FROM v)";
|
||||
|
||||
--connect (con2,localhost,root,,test)
|
||||
PREPARE stmt2 FROM "SELECT * FROM t1 WHERE a in (SELECT a FROM v)";
|
||||
EXECUTE stmt2;
|
||||
|
||||
--connection con1
|
||||
EXECUTE stmt1;
|
||||
INSERT INTO t2 VALUES (0);
|
||||
EXECUTE stmt1;
|
||||
START TRANSACTION;
|
||||
EXECUTE stmt1;
|
||||
|
||||
# Cleanup
|
||||
--disconnect con1
|
||||
--disconnect con2
|
||||
--connection default
|
||||
DROP VIEW v;
|
||||
DROP TABLE t1, t2;
|
||||
SET GLOBAL query_cache_size= @qcs.save, query_cache_type= @qct.save;
|
@ -243,6 +243,15 @@ UPDATE temp1,temp2 SET temp1.a = 5, temp2.a = 10;
|
||||
SELECT * FROM temp1, temp2;
|
||||
DROP TABLE temp1, temp2;
|
||||
|
||||
--echo
|
||||
--echo # MDEV-14185 CREATE TEMPORARY TABLE AS SELECT causes error 1290 with read_only and InnoDB.
|
||||
--echo
|
||||
|
||||
CREATE TEMPORARY TABLE temp1 ENGINE=INNODB AS SELECT a FROM t1;
|
||||
SELECT * FROM temp1;
|
||||
DROP TABLE temp1;
|
||||
|
||||
|
||||
--echo
|
||||
--echo # Disconnect and cleanup
|
||||
--echo
|
||||
|
@ -289,3 +289,13 @@ create database mysqltest1;
|
||||
create procedure mysqltest1.foo() select "foo";
|
||||
update mysql.proc set name='' where db='mysqltest1';
|
||||
drop database mysqltest1;
|
||||
|
||||
#
|
||||
# BUG#26881798: SERVER EXITS WHEN PRIMARY KEY IN MYSQL.PROC IS DROPPED
|
||||
#
|
||||
create procedure p1() set @foo = 10;
|
||||
alter table mysql.proc drop primary key;
|
||||
--error ER_CANNOT_LOAD_FROM_TABLE
|
||||
drop procedure p1;
|
||||
alter table mysql.proc add primary key (db,name,type);
|
||||
drop procedure p1;
|
||||
|
@ -2035,5 +2035,36 @@ SELECT ( SELECT COUNT(*) FROM t1 WHERE a = c ) AS field, COUNT(DISTINCT c)
|
||||
FROM t2 WHERE b <= 'quux' GROUP BY field;
|
||||
drop table t1,t2;
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-15555: select from DUAL where false yielding wrong result when in a IN
|
||||
--echo #
|
||||
|
||||
explain
|
||||
SELECT 2 IN (SELECT 2 from DUAL WHERE 1 != 1);
|
||||
SELECT 2 IN (SELECT 2 from DUAL WHERE 1 != 1);
|
||||
|
||||
SET optimizer_switch= @@global.optimizer_switch;
|
||||
set @@tmp_table_size= @@global.tmp_table_size;
|
||||
|
||||
--echo #
|
||||
--echo # mfrv-14515: Wrong results for tableless query with subquery in WHERE
|
||||
--echo # and implicit aggregation
|
||||
--echo #
|
||||
|
||||
create table t1 (i1 int, i2 int);
|
||||
insert into t1 values (1314, 1084),(1330, 1084),(1401, 1084),(580, 1084);
|
||||
|
||||
create table t2 (cd int);
|
||||
insert into t2 values
|
||||
(1330), (1330), (1330), (1330), (1330), (1330), (1330), (1330),
|
||||
(1330), (1330), (1330), (1330), (1330), (1330), (1330), (1330);
|
||||
|
||||
select max(10) from dual
|
||||
where exists (select 1 from t2 join t1 on t1.i1 = t2.cd and t1.i2 = 345);
|
||||
|
||||
insert into t2 select * from t2;
|
||||
|
||||
select max(10) from dual
|
||||
where exists (select 1 from t2 join t1 on t1.i1 = t2.cd and t1.i2 = 345);
|
||||
|
||||
DROP TABLE t1,t2;
|
||||
|
@ -254,3 +254,16 @@ SELECT a, b, (a, b) NOT IN (SELECT a, b FROM t2) as sq
|
||||
FROM t1;
|
||||
|
||||
drop table t1, t2;
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-15235: Assertion `length > 0' failed in create_ref_for_key
|
||||
--echo #
|
||||
|
||||
CREATE TABLE t1 (i INT);
|
||||
INSERT INTO t1 VALUES (1),(2);
|
||||
CREATE TABLE t2 (f CHAR(1));
|
||||
INSERT INTO t2 VALUES ('a'),('b');
|
||||
explain
|
||||
SELECT * FROM t2 WHERE f IN ( SELECT LEFT('foo',0) FROM t1 ORDER BY 1 );
|
||||
SELECT * FROM t2 WHERE f IN ( SELECT LEFT('foo',0) FROM t1 ORDER BY 1 );
|
||||
DROP TABLE t1, t2;
|
||||
|
@ -1384,4 +1384,41 @@ select e,f, (e , f) in (select e,b from t1 union select c,d from t2) as sub from
|
||||
select avg(f), (e , f) in (select e,b from t1 union select c,d from t2) as sub from t3 group by sub;
|
||||
drop table t1,t2,t3;
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-14715 Assertion `!table || (!table->read_set ||
|
||||
--echo # bitmap_is_set(table->read_set, field_index))'
|
||||
--echo # failed in Field_num::val_decimal
|
||||
--echo #
|
||||
|
||||
CREATE TABLE t1 (a INT, b INT) ENGINE=MyISAM;
|
||||
CREATE VIEW v1 AS SELECT * FROM t1;
|
||||
INSERT INTO t1 VALUES (1, NULL),(3, 4);
|
||||
|
||||
--error ER_INVALID_GROUP_FUNC_USE
|
||||
(SELECT a, sum(a) AS f FROM v1 group by a ORDER BY b + sum(a))
|
||||
UNION
|
||||
(SELECT 2, 2);
|
||||
|
||||
(SELECT a, sum(a) AS f FROM v1 group by a ORDER BY b + 1)
|
||||
UNION
|
||||
(SELECT 2, 2);
|
||||
|
||||
SELECT a, b FROM t1
|
||||
UNION
|
||||
(SELECT a, VAR_POP(a) AS f FROM v1 GROUP BY a ORDER BY b/a );
|
||||
|
||||
DROP TABLE t1;
|
||||
|
||||
--error ER_VIEW_INVALID
|
||||
(SELECT a, sum(a) AS f FROM v1 group by a ORDER BY b + 1)
|
||||
UNION
|
||||
(SELECT 2, 2);
|
||||
|
||||
DROP VIEW v1;
|
||||
|
||||
--error ER_NO_SUCH_TABLE
|
||||
(SELECT a, sum(a) AS f FROM v1 group by a ORDER BY b + 1)
|
||||
UNION
|
||||
(SELECT 2, 2);
|
||||
|
||||
--echo End of 5.5 tests
|
||||
|
@ -5169,118 +5169,6 @@ deallocate prepare stmt1;
|
||||
drop view v1,v2;
|
||||
drop table t1,t2;
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-6251: SIGSEGV in query optimizer (in set_check_materialized
|
||||
--echo # with MERGE view)
|
||||
--echo #
|
||||
|
||||
CREATE TABLE t1 (a1 INT(11) NOT NULL DEFAULT NULL AUTO_INCREMENT PRIMARY KEY);
|
||||
CREATE TABLE t2 (b1 INT(11) NOT NULL DEFAULT NULL AUTO_INCREMENT PRIMARY KEY);
|
||||
CREATE TABLE t3 (c1 INT(11) NOT NULL DEFAULT NULL AUTO_INCREMENT PRIMARY KEY);
|
||||
CREATE TABLE t4 (d1 INT(11) NOT NULL DEFAULT NULL AUTO_INCREMENT PRIMARY KEY);
|
||||
CREATE TABLE t5 (e1 INT(11) NOT NULL DEFAULT NULL AUTO_INCREMENT PRIMARY KEY);
|
||||
CREATE TABLE t6 (f1 INT(11) NOT NULL DEFAULT NULL AUTO_INCREMENT PRIMARY KEY);
|
||||
|
||||
CREATE OR REPLACE view v1 AS
|
||||
SELECT 1
|
||||
FROM t1 a_alias_1
|
||||
LEFT JOIN (t2 b_alias_1 JOIN t1 a_alias_2) ON b_alias_1.b1 = a_alias_1.a1 AND a_alias_2.a1 = a_alias_1.a1
|
||||
LEFT JOIN t3 c_alias_1 ON c_alias_1.c1 = a_alias_1.a1
|
||||
LEFT JOIN t4 d_alias_1 ON d_alias_1.d1 = a_alias_1.a1
|
||||
LEFT JOIN t3 c_alias_2 ON c_alias_2.c1 = a_alias_1.a1
|
||||
LEFT JOIN t5 e_alias_1 ON e_alias_1.e1 = a_alias_1.a1
|
||||
LEFT JOIN t6 f_alias_1 ON f_alias_1.f1 = a_alias_1.a1
|
||||
;
|
||||
|
||||
SELECT 1
|
||||
FROM (( SELECT 1
|
||||
FROM t1 a_alias_1
|
||||
LEFT JOIN (t2 b_alias_1 JOIN t1 a_alias_2) ON b_alias_1.b1 = a_alias_1.a1 AND a_alias_2.a1 = a_alias_1.a1
|
||||
LEFT JOIN t3 c_alias_1 ON c_alias_1.c1 = a_alias_1.a1
|
||||
LEFT JOIN t4 d_alias_1 ON d_alias_1.d1 = a_alias_1.a1
|
||||
LEFT JOIN t3 c_alias_2 ON c_alias_2.c1 = a_alias_1.a1
|
||||
LEFT JOIN t5 e_alias_1 ON e_alias_1.e1 = a_alias_1.a1
|
||||
LEFT JOIN t6 f_alias_1 ON f_alias_1.f1 = a_alias_1.a1
|
||||
) t1)
|
||||
LEFT OUTER JOIN (( SELECT 1
|
||||
FROM t1 a_alias_1
|
||||
LEFT JOIN (t2 b_alias_1 JOIN t1 a_alias_2) ON b_alias_1.b1 = a_alias_1.a1 AND a_alias_2.a1 = a_alias_1.a1
|
||||
LEFT JOIN t3 c_alias_1 ON c_alias_1.c1 = a_alias_1.a1
|
||||
LEFT JOIN t4 d_alias_1 ON d_alias_1.d1 = a_alias_1.a1
|
||||
LEFT JOIN t3 c_alias_2 ON c_alias_2.c1 = a_alias_1.a1
|
||||
LEFT JOIN t5 e_alias_1 ON e_alias_1.e1 = a_alias_1.a1
|
||||
LEFT JOIN t6 f_alias_1 ON f_alias_1.f1 = a_alias_1.a1
|
||||
) t2) ON 1=1
|
||||
LEFT OUTER JOIN (( SELECT 1
|
||||
FROM t1 a_alias_1
|
||||
LEFT JOIN (t2 b_alias_1 JOIN t1 a_alias_2) ON b_alias_1.b1 = a_alias_1.a1 AND a_alias_2.a1 = a_alias_1.a1
|
||||
LEFT JOIN t3 c_alias_1 ON c_alias_1.c1 = a_alias_1.a1
|
||||
LEFT JOIN t4 d_alias_1 ON d_alias_1.d1 = a_alias_1.a1
|
||||
LEFT JOIN t3 c_alias_2 ON c_alias_2.c1 = a_alias_1.a1
|
||||
LEFT JOIN t5 e_alias_1 ON e_alias_1.e1 = a_alias_1.a1
|
||||
LEFT JOIN t6 f_alias_1 ON f_alias_1.f1 = a_alias_1.a1
|
||||
) t3) ON 1=1
|
||||
LEFT OUTER JOIN (( SELECT 1
|
||||
FROM t1 a_alias_1
|
||||
LEFT JOIN (t2 b_alias_1 JOIN t1 a_alias_2) ON b_alias_1.b1 = a_alias_1.a1 AND a_alias_2.a1 = a_alias_1.a1
|
||||
LEFT JOIN t3 c_alias_1 ON c_alias_1.c1 = a_alias_1.a1
|
||||
LEFT JOIN t4 d_alias_1 ON d_alias_1.d1 = a_alias_1.a1
|
||||
LEFT JOIN t3 c_alias_2 ON c_alias_2.c1 = a_alias_1.a1
|
||||
LEFT JOIN t5 e_alias_1 ON e_alias_1.e1 = a_alias_1.a1
|
||||
LEFT JOIN t6 f_alias_1 ON f_alias_1.f1 = a_alias_1.a1
|
||||
) t4) ON 1=1
|
||||
LEFT OUTER JOIN (( SELECT 1
|
||||
FROM t1 a_alias_1
|
||||
LEFT JOIN (t2 b_alias_1 JOIN t1 a_alias_2) ON b_alias_1.b1 = a_alias_1.a1 AND a_alias_2.a1 = a_alias_1.a1
|
||||
LEFT JOIN t3 c_alias_1 ON c_alias_1.c1 = a_alias_1.a1
|
||||
LEFT JOIN t4 d_alias_1 ON d_alias_1.d1 = a_alias_1.a1
|
||||
LEFT JOIN t3 c_alias_2 ON c_alias_2.c1 = a_alias_1.a1
|
||||
LEFT JOIN t5 e_alias_1 ON e_alias_1.e1 = a_alias_1.a1
|
||||
LEFT JOIN t6 f_alias_1 ON f_alias_1.f1 = a_alias_1.a1
|
||||
) t5) ON 1=1
|
||||
LEFT OUTER JOIN (( SELECT 1
|
||||
FROM t1 a_alias_1
|
||||
LEFT JOIN (t2 b_alias_1 JOIN t1 a_alias_2) ON b_alias_1.b1 = a_alias_1.a1 AND a_alias_2.a1 = a_alias_1.a1
|
||||
LEFT JOIN t3 c_alias_1 ON c_alias_1.c1 = a_alias_1.a1
|
||||
LEFT JOIN t4 d_alias_1 ON d_alias_1.d1 = a_alias_1.a1
|
||||
LEFT JOIN t3 c_alias_2 ON c_alias_2.c1 = a_alias_1.a1
|
||||
LEFT JOIN t5 e_alias_1 ON e_alias_1.e1 = a_alias_1.a1
|
||||
LEFT JOIN t6 f_alias_1 ON f_alias_1.f1 = a_alias_1.a1
|
||||
) t6) ON 1=1
|
||||
LEFT OUTER JOIN (( SELECT 1
|
||||
FROM t1 a_alias_1
|
||||
LEFT JOIN (t2 b_alias_1 JOIN t1 a_alias_2) ON b_alias_1.b1 = a_alias_1.a1 AND a_alias_2.a1 = a_alias_1.a1
|
||||
LEFT JOIN t3 c_alias_1 ON c_alias_1.c1 = a_alias_1.a1
|
||||
LEFT JOIN t4 d_alias_1 ON d_alias_1.d1 = a_alias_1.a1
|
||||
LEFT JOIN t3 c_alias_2 ON c_alias_2.c1 = a_alias_1.a1
|
||||
LEFT JOIN t5 e_alias_1 ON e_alias_1.e1 = a_alias_1.a1
|
||||
LEFT JOIN t6 f_alias_1 ON f_alias_1.f1 = a_alias_1.a1
|
||||
) t7) ON 1=1
|
||||
LEFT OUTER JOIN (( SELECT 1
|
||||
FROM t1 a_alias_1
|
||||
LEFT JOIN (t2 b_alias_1 JOIN t1 a_alias_2) ON b_alias_1.b1 = a_alias_1.a1 AND a_alias_2.a1 = a_alias_1.a1
|
||||
LEFT JOIN t3 c_alias_1 ON c_alias_1.c1 = a_alias_1.a1
|
||||
LEFT JOIN t4 d_alias_1 ON d_alias_1.d1 = a_alias_1.a1
|
||||
LEFT JOIN t3 c_alias_2 ON c_alias_2.c1 = a_alias_1.a1
|
||||
LEFT JOIN t5 e_alias_1 ON e_alias_1.e1 = a_alias_1.a1
|
||||
LEFT JOIN t6 f_alias_1 ON f_alias_1.f1 = a_alias_1.a1
|
||||
) t8) ON 1=1
|
||||
;
|
||||
|
||||
SELECT 1
|
||||
FROM (v1 t1)
|
||||
LEFT OUTER JOIN (v1 t2) ON 1=1
|
||||
LEFT OUTER JOIN (v1 t3) ON 1=1
|
||||
LEFT OUTER JOIN (v1 t4) ON 1=1
|
||||
LEFT OUTER JOIN (v1 t5) ON 1=1
|
||||
LEFT OUTER JOIN (v1 t6) ON 1=1
|
||||
LEFT OUTER JOIN (v1 t7) ON 1=1
|
||||
LEFT OUTER JOIN (v1 t8) ON 1=1
|
||||
;
|
||||
|
||||
drop view v1;
|
||||
drop table t1,t2,t3,t4,t5,t6;
|
||||
|
||||
--echo # -----------------------------------------------------------------
|
||||
--echo # -- End of 5.3 tests.
|
||||
--echo # -----------------------------------------------------------------
|
||||
@ -5590,6 +5478,202 @@ SHOW CREATE VIEW v1;
|
||||
drop view v1;
|
||||
drop table t1;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS t0 (f0 INT);
|
||||
CREATE TABLE IF NOT EXISTS t1 (f1 INT);
|
||||
CREATE TABLE IF NOT EXISTS t2 (f2 INT);
|
||||
CREATE TABLE IF NOT EXISTS t3 (f3 INT);
|
||||
CREATE TABLE IF NOT EXISTS t4 (f4 INT);
|
||||
CREATE TABLE IF NOT EXISTS t5 (f5 INT);
|
||||
CREATE TABLE IF NOT EXISTS t6 (f6 INT);
|
||||
CREATE TABLE IF NOT EXISTS t7 (f7 INT);
|
||||
CREATE TABLE IF NOT EXISTS t8 (f8 INT);
|
||||
CREATE TABLE IF NOT EXISTS t9 (f9 INT);
|
||||
CREATE TABLE IF NOT EXISTS t10 (f10 INT);
|
||||
CREATE TABLE IF NOT EXISTS t11 (f11 INT);
|
||||
CREATE TABLE IF NOT EXISTS t12 (f12 INT);
|
||||
CREATE TABLE IF NOT EXISTS t13 (f13 INT);
|
||||
CREATE TABLE IF NOT EXISTS t14 (f14 INT);
|
||||
CREATE TABLE IF NOT EXISTS t15 (f15 INT);
|
||||
CREATE TABLE IF NOT EXISTS t16 (f16 INT);
|
||||
CREATE TABLE IF NOT EXISTS t17 (f17 INT);
|
||||
CREATE TABLE IF NOT EXISTS t18 (f18 INT);
|
||||
CREATE TABLE IF NOT EXISTS t19 (f19 INT);
|
||||
CREATE TABLE IF NOT EXISTS t20 (f20 INT);
|
||||
CREATE TABLE IF NOT EXISTS t21 (f21 INT);
|
||||
CREATE TABLE IF NOT EXISTS t22 (f22 INT);
|
||||
CREATE TABLE IF NOT EXISTS t23 (f23 INT);
|
||||
CREATE TABLE IF NOT EXISTS t24 (f24 INT);
|
||||
CREATE TABLE IF NOT EXISTS t25 (f25 INT);
|
||||
CREATE TABLE IF NOT EXISTS t26 (f26 INT);
|
||||
CREATE TABLE IF NOT EXISTS t27 (f27 INT);
|
||||
CREATE TABLE IF NOT EXISTS t28 (f28 INT);
|
||||
CREATE TABLE IF NOT EXISTS t29 (f29 INT);
|
||||
CREATE TABLE IF NOT EXISTS t30 (f30 INT);
|
||||
CREATE TABLE IF NOT EXISTS t31 (f31 INT);
|
||||
CREATE TABLE IF NOT EXISTS t32 (f32 INT);
|
||||
CREATE TABLE IF NOT EXISTS t33 (f33 INT);
|
||||
CREATE TABLE IF NOT EXISTS t34 (f34 INT);
|
||||
CREATE TABLE IF NOT EXISTS t35 (f35 INT);
|
||||
CREATE TABLE IF NOT EXISTS t36 (f36 INT);
|
||||
CREATE TABLE IF NOT EXISTS t37 (f37 INT);
|
||||
CREATE TABLE IF NOT EXISTS t38 (f38 INT);
|
||||
CREATE TABLE IF NOT EXISTS t39 (f39 INT);
|
||||
CREATE TABLE IF NOT EXISTS t40 (f40 INT);
|
||||
CREATE TABLE IF NOT EXISTS t41 (f41 INT);
|
||||
CREATE TABLE IF NOT EXISTS t42 (f42 INT);
|
||||
CREATE TABLE IF NOT EXISTS t43 (f43 INT);
|
||||
CREATE TABLE IF NOT EXISTS t44 (f44 INT);
|
||||
CREATE TABLE IF NOT EXISTS t45 (f45 INT);
|
||||
CREATE TABLE IF NOT EXISTS t46 (f46 INT);
|
||||
CREATE TABLE IF NOT EXISTS t47 (f47 INT);
|
||||
CREATE TABLE IF NOT EXISTS t48 (f48 INT);
|
||||
CREATE TABLE IF NOT EXISTS t49 (f49 INT);
|
||||
CREATE TABLE IF NOT EXISTS t50 (f50 INT);
|
||||
CREATE TABLE IF NOT EXISTS t51 (f51 INT);
|
||||
CREATE TABLE IF NOT EXISTS t52 (f52 INT);
|
||||
CREATE TABLE IF NOT EXISTS t53 (f53 INT);
|
||||
CREATE TABLE IF NOT EXISTS t54 (f54 INT);
|
||||
CREATE TABLE IF NOT EXISTS t55 (f55 INT);
|
||||
CREATE TABLE IF NOT EXISTS t56 (f56 INT);
|
||||
CREATE TABLE IF NOT EXISTS t57 (f57 INT);
|
||||
CREATE TABLE IF NOT EXISTS t58 (f58 INT);
|
||||
CREATE TABLE IF NOT EXISTS t59 (f59 INT);
|
||||
CREATE TABLE IF NOT EXISTS t60 (f60 INT);
|
||||
CREATE OR REPLACE VIEW v60 AS SELECT * FROM t60;
|
||||
|
||||
EXPLAIN
|
||||
SELECT t0.*
|
||||
FROM t0
|
||||
JOIN t1
|
||||
ON t1.f1 = t0.f0
|
||||
LEFT JOIN t2
|
||||
ON t0.f0 = t2.f2
|
||||
LEFT JOIN t3
|
||||
ON t0.f0 = t3.f3
|
||||
LEFT JOIN t4
|
||||
ON t0.f0 = t4.f4
|
||||
LEFT JOIN t5
|
||||
ON t4.f4 = t5.f5
|
||||
LEFT JOIN t6
|
||||
ON t0.f0 = t6.f6
|
||||
LEFT JOIN t7
|
||||
ON t0.f0 = t7.f7
|
||||
LEFT JOIN t8
|
||||
ON t0.f0 = t8.f8
|
||||
LEFT JOIN t9
|
||||
ON t0.f0 = t9.f9
|
||||
LEFT JOIN t10
|
||||
ON t0.f0 = t10.f10
|
||||
LEFT JOIN t11
|
||||
ON t0.f0 = t11.f11
|
||||
LEFT JOIN t12
|
||||
ON t0.f0 = t12.f12
|
||||
LEFT JOIN t13
|
||||
ON t0.f0 = t13.f13
|
||||
LEFT JOIN t14
|
||||
ON t0.f0 = t14.f14
|
||||
LEFT JOIN t15
|
||||
ON t0.f0 = t15.f15
|
||||
LEFT JOIN t16
|
||||
ON t0.f0 = t16.f16
|
||||
LEFT JOIN t17
|
||||
ON t0.f0 = t17.f17
|
||||
LEFT JOIN t18
|
||||
ON t0.f0 = t18.f18
|
||||
LEFT JOIN t19
|
||||
ON t18.f18 = t19.f19
|
||||
LEFT JOIN t20
|
||||
ON t20.f20 = t19.f19
|
||||
LEFT JOIN t21
|
||||
ON t20.f20 = t21.f21
|
||||
LEFT JOIN t22
|
||||
ON t19.f19 = t22.f22
|
||||
LEFT JOIN t23
|
||||
ON t23.f23 = t0.f0
|
||||
LEFT JOIN t24
|
||||
ON t24.f24 = t23.f23
|
||||
LEFT JOIN t25
|
||||
ON t0.f0 = t25.f25
|
||||
LEFT JOIN t26
|
||||
ON t26.f26 = t0.f0
|
||||
LEFT JOIN t27
|
||||
ON t27.f27 = t0.f0
|
||||
LEFT JOIN t28
|
||||
ON t0.f0 = t28.f28
|
||||
LEFT JOIN t29
|
||||
ON t0.f0 = t29.f29
|
||||
LEFT JOIN t30
|
||||
ON t30.f30 = t0.f0
|
||||
LEFT JOIN t31
|
||||
ON t0.f0 = t31.f31
|
||||
LEFT JOIN t32
|
||||
ON t32.f32 = t31.f31
|
||||
LEFT JOIN t33
|
||||
ON t33.f33 = t0.f0
|
||||
LEFT JOIN t34
|
||||
ON t33.f33 = t34.f34
|
||||
LEFT JOIN t35
|
||||
ON t33.f33 = t35.f35
|
||||
LEFT JOIN t36
|
||||
ON t36.f36 = t0.f0
|
||||
LEFT JOIN t37
|
||||
ON t32.f32 = t37.f37
|
||||
LEFT JOIN t38
|
||||
ON t31.f31 = t38.f38
|
||||
LEFT JOIN t39
|
||||
ON t39.f39 = t0.f0
|
||||
LEFT JOIN t40
|
||||
ON t40.f40 = t39.f39
|
||||
LEFT JOIN t41
|
||||
ON t41.f41 = t0.f0
|
||||
LEFT JOIN t42
|
||||
ON t42.f42 = t41.f41
|
||||
LEFT JOIN t43
|
||||
ON t43.f43 = t41.f41
|
||||
LEFT JOIN t44
|
||||
ON t44.f44 = t0.f0
|
||||
LEFT JOIN t45
|
||||
ON t45.f45 = t0.f0
|
||||
LEFT JOIN t46
|
||||
ON t46.f46 = t0.f0
|
||||
LEFT JOIN t47
|
||||
ON t47.f47 = t0.f0
|
||||
LEFT JOIN t48
|
||||
ON t48.f48 = t0.f0
|
||||
LEFT JOIN t49
|
||||
ON t0.f0 = t49.f49
|
||||
LEFT JOIN t50
|
||||
ON t0.f0 = t50.f50
|
||||
LEFT JOIN t51
|
||||
ON t0.f0 = t51.f51
|
||||
LEFT JOIN t52
|
||||
ON t52.f52 = t0.f0
|
||||
LEFT JOIN t53
|
||||
ON t53.f53 = t0.f0
|
||||
LEFT JOIN t54
|
||||
ON t54.f54 = t0.f0
|
||||
LEFT JOIN t55
|
||||
ON t55.f55 = t0.f0
|
||||
LEFT JOIN t56
|
||||
ON t56.f56 = t0.f0
|
||||
LEFT JOIN t57
|
||||
ON t57.f57 = t0.f0
|
||||
LEFT JOIN t58
|
||||
ON t58.f58 = t57.f57
|
||||
LEFT JOIN t59
|
||||
ON t36.f36 = t59.f59
|
||||
LEFT JOIN v60
|
||||
ON t36.f36 = v60.f60
|
||||
;
|
||||
drop table t0, t1, t2, t3, t4, t5, t6, t7, t8, t9,
|
||||
t10, t11, t12, t13, t14, t15, t16, t17, t18,
|
||||
t19, t20, t21, t22, t23, t24, t25, t26, t27,
|
||||
t28, t29, t30, t31, t32, t33, t34, t35, t36,
|
||||
t37, t38, t39, t40, t41, t42, t43, t44, t45,
|
||||
t46, t47, t48, t49, t50, t51, t52, t53, t54,
|
||||
t55, t56, t57, t58, t59,t60;
|
||||
drop view v60;
|
||||
|
||||
--echo # -----------------------------------------------------------------
|
||||
--echo # -- End of 5.5 tests.
|
||||
--echo # -----------------------------------------------------------------
|
||||
|
@ -67,7 +67,7 @@ ENDIF()
|
||||
|
||||
ADD_CONVENIENCE_LIBRARY(mysys ${MYSYS_SOURCES})
|
||||
TARGET_LINK_LIBRARIES(mysys dbug strings ${ZLIB_LIBRARY}
|
||||
${LIBNSL} ${LIBM} ${LIBRT} ${LIBSOCKET} ${LIBEXECINFO})
|
||||
${LIBNSL} ${LIBM} ${LIBRT} ${LIBSOCKET} ${LIBEXECINFO} ${LIBDL})
|
||||
DTRACE_INSTRUMENT(mysys)
|
||||
|
||||
IF(HAVE_BFD_H)
|
||||
|
@ -1114,10 +1114,12 @@ void print_defaults(const char *conf_file, const char **groups)
|
||||
}
|
||||
}
|
||||
puts("\nThe following options may be given as the first argument:\n\
|
||||
--print-defaults Print the program argument list and exit.\n\
|
||||
--no-defaults Don't read default options from any option file.\n\
|
||||
--defaults-file=# Only read default options from the given file #.\n\
|
||||
--defaults-extra-file=# Read this file after the global files are read.");
|
||||
--print-defaults Print the program argument list and exit.\n\
|
||||
--no-defaults Don't read default options from any option file.\n\
|
||||
The following specify which files/extra groups are read (specified before remaining options):\n\
|
||||
--defaults-file=# Only read default options from the given file #.\n\
|
||||
--defaults-extra-file=# Read this file after the global files are read.\n\
|
||||
--defaults-group-suffix=# Additionally read default groups with # appended as a suffix.");
|
||||
}
|
||||
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
/* Copyright (c) 2006, 2010, Oracle and/or its affiliates.
|
||||
Copyright (c) 2009, 2016, MariaDB
|
||||
/* Copyright (c) 2006, 2018, Oracle and/or its affiliates.
|
||||
Copyright (c) 2009, 2018, 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
|
||||
@ -86,7 +86,8 @@ retry:
|
||||
do { /* PTR() isn't necessary below, head is a dummy node */
|
||||
cursor->curr= (LF_SLIST *)(*cursor->prev);
|
||||
_lf_pin(pins, 1, cursor->curr);
|
||||
} while (*cursor->prev != (intptr)cursor->curr && LF_BACKOFF);
|
||||
} while (my_atomic_loadptr((void**)cursor->prev) != cursor->curr &&
|
||||
LF_BACKOFF);
|
||||
for (;;)
|
||||
{
|
||||
if (unlikely(!cursor->curr))
|
||||
@ -100,7 +101,7 @@ retry:
|
||||
cur_hashnr= cursor->curr->hashnr;
|
||||
cur_key= cursor->curr->key;
|
||||
cur_keylen= cursor->curr->keylen;
|
||||
if (*cursor->prev != (intptr)cursor->curr)
|
||||
if (my_atomic_loadptr((void**)cursor->prev) != cursor->curr)
|
||||
{
|
||||
(void)LF_BACKOFF;
|
||||
goto retry;
|
||||
|
@ -258,7 +258,7 @@ int init_io_cache(IO_CACHE *info, File file, size_t cachesize,
|
||||
else
|
||||
{
|
||||
/* Clear mutex so that safe_mutex will notice that it's not initialized */
|
||||
bzero((char*) &info->append_buffer_lock, sizeof(info));
|
||||
bzero((char*) &info->append_buffer_lock, sizeof(info->append_buffer_lock));
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@ -132,15 +132,79 @@ err:
|
||||
|
||||
#include <m_string.h>
|
||||
#include <ctype.h>
|
||||
|
||||
#include <sys/wait.h>
|
||||
|
||||
static int in[2], out[2];
|
||||
static int initialized= 0;
|
||||
static pid_t pid;
|
||||
static char addr2line_binary[1024];
|
||||
static char output[1024];
|
||||
|
||||
int start_addr2line_fork(const char *binary_path)
|
||||
{
|
||||
|
||||
if (pid > 0)
|
||||
{
|
||||
/* Don't leak FDs */
|
||||
close(in[1]);
|
||||
close(out[0]);
|
||||
/* Don't create zombie processes. */
|
||||
waitpid(pid, NULL, 0);
|
||||
}
|
||||
|
||||
if (pipe(in) < 0)
|
||||
return 1;
|
||||
if (pipe(out) < 0)
|
||||
return 1;
|
||||
|
||||
pid = fork();
|
||||
if (pid == -1)
|
||||
return 1;
|
||||
|
||||
if (!pid) /* child */
|
||||
{
|
||||
dup2(in[0], 0);
|
||||
dup2(out[1], 1);
|
||||
close(in[0]);
|
||||
close(in[1]);
|
||||
close(out[0]);
|
||||
close(out[1]);
|
||||
execlp("addr2line", "addr2line", "-C", "-f", "-e", binary_path, NULL);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
close(in[0]);
|
||||
close(out[1]);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int my_addr_resolve(void *ptr, my_addr_loc *loc)
|
||||
{
|
||||
char input[32], *s;
|
||||
size_t len;
|
||||
|
||||
len= my_snprintf(input, sizeof(input), "%p\n", ptr);
|
||||
Dl_info info;
|
||||
void *offset;
|
||||
|
||||
if (!dladdr(ptr, &info))
|
||||
return 1;
|
||||
|
||||
if (strcmp(addr2line_binary, info.dli_fname))
|
||||
{
|
||||
/* We use dli_fname in case the path is longer than the length of our static
|
||||
string. We don't want to allocate anything dynamicaly here as we are in
|
||||
a "crashed" state. */
|
||||
if (start_addr2line_fork(info.dli_fname))
|
||||
{
|
||||
addr2line_binary[0] = '\0';
|
||||
return 1;
|
||||
}
|
||||
/* Save result for future comparisons. */
|
||||
strnmov(addr2line_binary, info.dli_fname, sizeof(addr2line_binary));
|
||||
}
|
||||
offset = info.dli_fbase;
|
||||
len= my_snprintf(input, sizeof(input), "%08x\n", (ulonglong)(ptr - offset));
|
||||
if (write(in[1], input, len) <= 0)
|
||||
return 1;
|
||||
if (read(out[0], output, sizeof(output)) <= 0)
|
||||
@ -168,35 +232,6 @@ int my_addr_resolve(void *ptr, my_addr_loc *loc)
|
||||
|
||||
const char *my_addr_resolve_init()
|
||||
{
|
||||
if (!initialized)
|
||||
{
|
||||
pid_t pid;
|
||||
|
||||
if (pipe(in) < 0)
|
||||
return "pipe(in)";
|
||||
if (pipe(out) < 0)
|
||||
return "pipe(out)";
|
||||
|
||||
pid = fork();
|
||||
if (pid == -1)
|
||||
return "fork";
|
||||
|
||||
if (!pid) /* child */
|
||||
{
|
||||
dup2(in[0], 0);
|
||||
dup2(out[1], 1);
|
||||
close(in[0]);
|
||||
close(in[1]);
|
||||
close(out[0]);
|
||||
close(out[1]);
|
||||
execlp("addr2line", "addr2line", "-C", "-f", "-e", my_progname, NULL);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
close(in[0]);
|
||||
close(out[1]);
|
||||
initialized= 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
@ -22,6 +22,8 @@
|
||||
#undef EXTRA_DEBUG
|
||||
#define EXTRA_DEBUG
|
||||
|
||||
#define TRASH_MEM(X) TRASH_FREE(((char*)(X) + ((X)->size-(X)->left)), (X)->left)
|
||||
|
||||
/*
|
||||
Initialize memory root
|
||||
|
||||
@ -60,12 +62,13 @@ void init_alloc_root(MEM_ROOT *mem_root, size_t block_size,
|
||||
if (pre_alloc_size)
|
||||
{
|
||||
if ((mem_root->free= mem_root->pre_alloc=
|
||||
(USED_MEM*) my_malloc(pre_alloc_size+ ALIGN_SIZE(sizeof(USED_MEM)),
|
||||
(USED_MEM*) my_malloc(pre_alloc_size + ALIGN_SIZE(sizeof(USED_MEM)),
|
||||
MYF(0))))
|
||||
{
|
||||
mem_root->free->size= pre_alloc_size+ALIGN_SIZE(sizeof(USED_MEM));
|
||||
mem_root->free->left= pre_alloc_size;
|
||||
mem_root->free->next= 0;
|
||||
TRASH_MEM(mem_root->free);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
@ -133,6 +136,7 @@ void reset_root_defaults(MEM_ROOT *mem_root, size_t block_size,
|
||||
mem->left= pre_alloc_size;
|
||||
mem->next= *prev;
|
||||
*prev= mem_root->pre_alloc= mem;
|
||||
TRASH_MEM(mem);
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -228,6 +232,7 @@ void *alloc_root(MEM_ROOT *mem_root, size_t length)
|
||||
next->size= get_size;
|
||||
next->left= get_size-ALIGN_SIZE(sizeof(USED_MEM));
|
||||
*prev=next;
|
||||
TRASH_MEM(next);
|
||||
}
|
||||
|
||||
point= (uchar*) ((char*) next+ (next->size-next->left));
|
||||
@ -296,8 +301,6 @@ void *multi_alloc_root(MEM_ROOT *root, ...)
|
||||
DBUG_RETURN((void*) start);
|
||||
}
|
||||
|
||||
#define TRASH_MEM(X) TRASH(((char*)(X) + ((X)->size-(X)->left)), (X)->left)
|
||||
|
||||
/* Mark all data in blocks free for reusage */
|
||||
|
||||
static inline void mark_blocks_free(MEM_ROOT* root)
|
||||
|
@ -423,8 +423,6 @@ void my_thread_end(void)
|
||||
if (--THR_thread_count == 0)
|
||||
mysql_cond_signal(&THR_COND_threads);
|
||||
mysql_mutex_unlock(&THR_LOCK_threads);
|
||||
|
||||
TRASH(tmp, sizeof(*tmp));
|
||||
free(tmp);
|
||||
}
|
||||
}
|
||||
|
@ -448,7 +448,7 @@ else
|
||||
echo
|
||||
echo "You can also try to start the mysqld daemon with:"
|
||||
echo
|
||||
echo " shell> $mysqld --skip-grant --general-log &"
|
||||
echo " shell> $mysqld --skip-grant-tables --general-log &"
|
||||
echo
|
||||
echo "and use the command line tool $bindir/mysql"
|
||||
echo "to connect to the mysql database and look at the grant tables:"
|
||||
@ -459,8 +459,8 @@ else
|
||||
echo "Try 'mysqld --help' if you have problems with paths. Using"
|
||||
echo "--general-log gives you a log in $ldata that may be helpful."
|
||||
link_to_help
|
||||
echo "MariaDB is hosted on launchpad; You can find the latest source and"
|
||||
echo "email lists at http://launchpad.net/maria"
|
||||
echo "You can find the latest source at https://downloads.mariadb.org and"
|
||||
echo "the maria-discuss email list at https://launchpad.net/~maria-discuss"
|
||||
echo
|
||||
echo "Please check all of the above before submitting a bug report"
|
||||
echo "at http://mariadb.org/jira"
|
||||
|
@ -1708,7 +1708,7 @@ read_one_row(MYSQL *mysql,uint fields,MYSQL_ROW row, ulong *lengths)
|
||||
}
|
||||
else
|
||||
{
|
||||
if (len > (ulong) (end_pos - pos))
|
||||
if (pos + len > end_pos)
|
||||
{
|
||||
set_mysql_error(mysql, CR_UNKNOWN_ERROR, unknown_sqlstate);
|
||||
return -1;
|
||||
@ -2532,10 +2532,10 @@ static int send_client_reply_packet(MCPVIO_EXT *mpvio,
|
||||
if (mysql->client_flag & CLIENT_MULTI_STATEMENTS)
|
||||
mysql->client_flag|= CLIENT_MULTI_RESULTS;
|
||||
|
||||
#if defined(HAVE_OPENSSL) && !defined(EMBEDDED_LIBRARY)
|
||||
#ifdef HAVE_OPENSSL
|
||||
if (mysql->options.use_ssl)
|
||||
mysql->client_flag|= CLIENT_SSL;
|
||||
#endif /* HAVE_OPENSSL && !EMBEDDED_LIBRARY*/
|
||||
#endif /* HAVE_OPENSSL */
|
||||
|
||||
if (mpvio->db)
|
||||
mysql->client_flag|= CLIENT_CONNECT_WITH_DB;
|
||||
|
@ -1,5 +1,6 @@
|
||||
/*
|
||||
Copyright (c) 2006, 2011, Oracle and/or its affiliates.
|
||||
Copyright (c) 2006, 2017, Oracle and/or its affiliates.
|
||||
Copyright (c) 2009, 2018, 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
|
||||
@ -176,6 +177,8 @@ protected:
|
||||
error_log_print(ERROR_LEVEL, fmt, args);
|
||||
va_end(args);
|
||||
}
|
||||
public:
|
||||
Event_db_intact() { has_keys= TRUE; }
|
||||
};
|
||||
|
||||
/** In case of an error, a message is printed to the error log. */
|
||||
|
@ -208,7 +208,7 @@ class Field
|
||||
public:
|
||||
static void *operator new(size_t size) throw ()
|
||||
{ return sql_alloc(size); }
|
||||
static void operator delete(void *ptr_arg, size_t size) { TRASH(ptr_arg, size); }
|
||||
static void operator delete(void *ptr_arg, size_t size) { TRASH_FREE(ptr_arg, size); }
|
||||
|
||||
uchar *ptr; // Position to field in record
|
||||
/**
|
||||
|
@ -3841,7 +3841,8 @@ int
|
||||
handler::ha_create_handler_files(const char *name, const char *old_name,
|
||||
int action_flag, HA_CREATE_INFO *info)
|
||||
{
|
||||
mark_trx_read_write();
|
||||
if (!opt_readonly || !info || !(info->options & HA_LEX_CREATE_TMP_TABLE))
|
||||
mark_trx_read_write();
|
||||
|
||||
return create_handler_files(name, old_name, action_flag, info);
|
||||
}
|
||||
|
@ -10010,7 +10010,7 @@ const char *dbug_print_item(Item *item)
|
||||
if (!item)
|
||||
return "(Item*)NULL";
|
||||
item->print(&str ,QT_ORDINARY);
|
||||
if (str.c_ptr() == buf)
|
||||
if (str.c_ptr_safe() == buf)
|
||||
return buf;
|
||||
else
|
||||
return "Couldn't fit into buffer";
|
||||
|
@ -50,6 +50,12 @@ bool trace_unsupported_by_check_vcol_func_processor(const char *where)
|
||||
return trace_unsupported_func(where, "check_vcol_func_processor");
|
||||
}
|
||||
|
||||
#ifdef DBUG_OFF
|
||||
static inline const char *dbug_print_item(Item *item) { return NULL; }
|
||||
#else
|
||||
extern const char *dbug_print_item(Item *item);
|
||||
#endif
|
||||
|
||||
class Protocol;
|
||||
struct TABLE_LIST;
|
||||
void item_init(void); /* Init item functions */
|
||||
@ -580,7 +586,7 @@ public:
|
||||
{ return sql_alloc(size); }
|
||||
static void *operator new(size_t size, MEM_ROOT *mem_root) throw ()
|
||||
{ return alloc_root(mem_root, size); }
|
||||
static void operator delete(void *ptr,size_t size) { TRASH(ptr, size); }
|
||||
static void operator delete(void *ptr,size_t size) { TRASH_FREE(ptr, size); }
|
||||
static void operator delete(void *ptr, MEM_ROOT *mem_root) {}
|
||||
|
||||
enum Type {FIELD_ITEM= 0, FUNC_ITEM, SUM_FUNC_ITEM, STRING_ITEM,
|
||||
|
@ -1420,6 +1420,7 @@ bool Item_in_optimizer::is_top_level_item()
|
||||
|
||||
void Item_in_optimizer::fix_after_pullout(st_select_lex *new_parent, Item **ref)
|
||||
{
|
||||
DBUG_ASSERT(fixed);
|
||||
/* This will re-calculate attributes of our Item_in_subselect: */
|
||||
Item_bool_func::fix_after_pullout(new_parent, ref);
|
||||
|
||||
@ -1443,6 +1444,33 @@ bool Item_in_optimizer::eval_not_null_tables(uchar *opt_arg)
|
||||
}
|
||||
|
||||
|
||||
void Item_in_optimizer::print(String *str, enum_query_type query_type)
|
||||
{
|
||||
restore_first_argument();
|
||||
Item_func::print(str, query_type);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
"Restore" first argument before fix_fields() call (after it is harmless).
|
||||
|
||||
@Note: Main pointer to left part of IN/ALL/ANY subselect is subselect's
|
||||
lest_expr (see Item_in_optimizer::fix_left) so changes made during
|
||||
fix_fields will be rolled back there which can make
|
||||
Item_in_optimizer::args[0] unusable on second execution before fix_left()
|
||||
call. This call fix the pointer.
|
||||
*/
|
||||
|
||||
void Item_in_optimizer::restore_first_argument()
|
||||
{
|
||||
if (args[1]->type() == Item::SUBSELECT_ITEM &&
|
||||
((Item_subselect *)args[1])->is_in_predicate())
|
||||
{
|
||||
args[0]= ((Item_in_subselect *)args[1])->left_expr;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
bool Item_in_optimizer::fix_left(THD *thd, Item **ref)
|
||||
{
|
||||
DBUG_ENTER("Item_in_optimizer::fix_left");
|
||||
@ -1588,6 +1616,8 @@ Item *Item_in_optimizer::expr_cache_insert_transformer(uchar *thd_arg)
|
||||
{
|
||||
THD *thd= (THD*) thd_arg;
|
||||
DBUG_ENTER("Item_in_optimizer::expr_cache_insert_transformer");
|
||||
DBUG_ASSERT(fixed);
|
||||
|
||||
if (args[1]->type() != Item::SUBSELECT_ITEM)
|
||||
DBUG_RETURN(this); // MAX/MIN transformed => do nothing
|
||||
|
||||
@ -1611,6 +1641,7 @@ Item *Item_in_optimizer::expr_cache_insert_transformer(uchar *thd_arg)
|
||||
|
||||
void Item_in_optimizer::get_cache_parameters(List<Item> ¶meters)
|
||||
{
|
||||
DBUG_ASSERT(fixed);
|
||||
/* Add left expression to the list of the parameters of the subquery */
|
||||
if (args[0]->cols() == 1)
|
||||
parameters.add_unique(args[0], &cmp_items);
|
||||
@ -1842,6 +1873,7 @@ Item *Item_in_optimizer::transform(Item_transformer transformer, uchar *argument
|
||||
{
|
||||
Item *new_item;
|
||||
|
||||
DBUG_ASSERT(fixed);
|
||||
DBUG_ASSERT(!current_thd->stmt_arena->is_stmt_prepare());
|
||||
DBUG_ASSERT(arg_count == 2);
|
||||
|
||||
@ -1893,6 +1925,7 @@ Item *Item_in_optimizer::transform(Item_transformer transformer, uchar *argument
|
||||
|
||||
bool Item_in_optimizer::is_expensive_processor(uchar *arg)
|
||||
{
|
||||
DBUG_ASSERT(fixed);
|
||||
return args[0]->is_expensive_processor(arg) ||
|
||||
args[1]->is_expensive_processor(arg);
|
||||
}
|
||||
@ -1900,6 +1933,7 @@ bool Item_in_optimizer::is_expensive_processor(uchar *arg)
|
||||
|
||||
bool Item_in_optimizer::is_expensive()
|
||||
{
|
||||
DBUG_ASSERT(fixed);
|
||||
return args[0]->is_expensive() || args[1]->is_expensive();
|
||||
}
|
||||
|
||||
|
@ -255,6 +255,7 @@ public:
|
||||
bool is_null();
|
||||
longlong val_int();
|
||||
void cleanup();
|
||||
enum Functype functype() const { return IN_OPTIMIZER_FUNC; }
|
||||
const char *func_name() const { return "<in_optimizer>"; }
|
||||
Item_cache **get_cache() { return &cache; }
|
||||
void keep_top_level_cache();
|
||||
@ -268,6 +269,12 @@ public:
|
||||
bool is_top_level_item();
|
||||
bool eval_not_null_tables(uchar *opt_arg);
|
||||
void fix_after_pullout(st_select_lex *new_parent, Item **ref);
|
||||
virtual void print(String *str, enum_query_type query_type);
|
||||
void restore_first_argument();
|
||||
Item* get_wrapped_in_subselect_item()
|
||||
{
|
||||
return args[1];
|
||||
}
|
||||
};
|
||||
|
||||
class Comp_creator
|
||||
|
@ -595,6 +595,7 @@ my_decimal *Item_real_func::val_decimal(my_decimal *decimal_value)
|
||||
}
|
||||
|
||||
|
||||
#ifdef HAVE_DLOPEN
|
||||
void Item_udf_func::fix_num_length_and_dec()
|
||||
{
|
||||
uint fl_length= 0;
|
||||
@ -611,6 +612,7 @@ void Item_udf_func::fix_num_length_and_dec()
|
||||
max_length= float_length(NOT_FIXED_DEC);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
/**
|
||||
|
@ -66,7 +66,7 @@ public:
|
||||
NOW_FUNC, TRIG_COND_FUNC,
|
||||
SUSERVAR_FUNC, GUSERVAR_FUNC, COLLATE_FUNC,
|
||||
EXTRACT_FUNC, CHAR_TYPECAST_FUNC, FUNC_SP, UDF_FUNC,
|
||||
NEG_FUNC, GSYSVAR_FUNC };
|
||||
NEG_FUNC, GSYSVAR_FUNC, IN_OPTIMIZER_FUNC };
|
||||
enum optimize_type { OPTIMIZE_NONE,OPTIMIZE_KEY,OPTIMIZE_OP, OPTIMIZE_NULL,
|
||||
OPTIMIZE_EQUAL };
|
||||
enum Type type() const { return FUNC_ITEM; }
|
||||
@ -2133,6 +2133,8 @@ public:
|
||||
Item_func_uuid_short() :Item_int_func() {}
|
||||
const char *func_name() const { return "uuid_short"; }
|
||||
longlong val_int();
|
||||
bool const_item() const { return false; }
|
||||
table_map used_tables() const { return RAND_TABLE_BIT; }
|
||||
void fix_length_and_dec()
|
||||
{ max_length= 21; unsigned_flag=1; }
|
||||
bool check_vcol_func_processor(uchar *int_arg)
|
||||
|
@ -997,6 +997,8 @@ public:
|
||||
DERIVATION_COERCIBLE, MY_REPERTOIRE_ASCII);
|
||||
fix_char_length(MY_UUID_STRING_LENGTH);
|
||||
}
|
||||
bool const_item() const { return false; }
|
||||
table_map used_tables() const { return RAND_TABLE_BIT; }
|
||||
const char *func_name() const{ return "uuid"; }
|
||||
String *val_str(String *);
|
||||
bool check_vcol_func_processor(uchar *int_arg)
|
||||
|
@ -1746,7 +1746,7 @@ Item_in_subselect::single_value_transformer(JOIN *join)
|
||||
Item* join_having= join->having ? join->having : join->tmp_having;
|
||||
if (!(join_having || select_lex->with_sum_func ||
|
||||
select_lex->group_list.elements) &&
|
||||
select_lex->table_list.elements == 0 &&
|
||||
select_lex->table_list.elements == 0 && !join->conds &&
|
||||
!select_lex->master_unit()->is_union())
|
||||
{
|
||||
Item *where_item= (Item*) select_lex->item_list.head();
|
||||
|
@ -62,7 +62,8 @@ int find_ref_key(KEY *key, uint key_count, uchar *record, Field *field,
|
||||
i < (int) key_count ;
|
||||
i++, key_info++)
|
||||
{
|
||||
if (key_info->key_part[0].offset == fieldpos)
|
||||
if (key_info->key_part[0].offset == fieldpos &&
|
||||
key_info->key_part[0].field->type() != MYSQL_TYPE_BIT)
|
||||
{ /* Found key. Calc keylength */
|
||||
*key_length= *keypart= 0;
|
||||
return i; /* Use this key */
|
||||
@ -81,7 +82,8 @@ int find_ref_key(KEY *key, uint key_count, uchar *record, Field *field,
|
||||
j < key_info->key_parts ;
|
||||
j++, key_part++)
|
||||
{
|
||||
if (key_part->offset == fieldpos)
|
||||
if (key_part->offset == fieldpos &&
|
||||
key_part->field->type() != MYSQL_TYPE_BIT)
|
||||
{
|
||||
*keypart= j;
|
||||
return i; /* Use this key */
|
||||
|
120
sql/log_event.cc
120
sql/log_event.cc
@ -1,6 +1,6 @@
|
||||
/*
|
||||
Copyright (c) 2000, 2016, Oracle and/or its affiliates.
|
||||
Copyright (c) 2009, 2016, MariaDB
|
||||
Copyright (c) 2000, 2018, Oracle and/or its affiliates.
|
||||
Copyright (c) 2009, 2018, 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
|
||||
@ -3343,6 +3343,25 @@ Query_log_event::Query_log_event(const char* buf, uint event_len,
|
||||
db= (char *)start;
|
||||
query= (char *)(start + db_len + 1);
|
||||
q_len= data_len - db_len -1;
|
||||
|
||||
if (data_len && (data_len < db_len ||
|
||||
data_len < q_len ||
|
||||
data_len != (db_len + q_len + 1)))
|
||||
{
|
||||
q_len= 0;
|
||||
query= NULL;
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
|
||||
unsigned int max_length;
|
||||
max_length= (event_len - ((const char*)(end + db_len + 1) -
|
||||
(buf - common_header_len)));
|
||||
if (q_len != max_length)
|
||||
{
|
||||
q_len= 0;
|
||||
query= NULL;
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
/**
|
||||
Append the db length at the end of the buffer. This will be used by
|
||||
Query_cache::send_result_to_client() in case the query cache is On.
|
||||
@ -3623,6 +3642,20 @@ int Query_log_event::do_apply_event(Relay_log_info const *rli,
|
||||
you.
|
||||
*/
|
||||
thd->catalog= catalog_len ? (char *) catalog : (char *)"";
|
||||
|
||||
int len_error;
|
||||
size_t valid_len= system_charset_info->cset->well_formed_len(system_charset_info,
|
||||
db, db + db_len, db_len, &len_error);
|
||||
|
||||
if (valid_len != db_len)
|
||||
{
|
||||
rli->report(ERROR_LEVEL, ER_SLAVE_FATAL_ERROR,
|
||||
ER_THD(thd, ER_SLAVE_FATAL_ERROR),
|
||||
"Invalid database name in Query event.");
|
||||
thd->is_slave_error= true;
|
||||
goto end;
|
||||
}
|
||||
|
||||
new_db.length= db_len;
|
||||
new_db.str= (char *) rpl_filter->get_rewrite_db(db, &new_db.length);
|
||||
thd->set_db(new_db.str, new_db.length); /* allocates a copy of 'db' */
|
||||
@ -3799,7 +3832,23 @@ int Query_log_event::do_apply_event(Relay_log_info const *rli,
|
||||
}
|
||||
else
|
||||
thd->variables.collation_database= thd->db_charset;
|
||||
|
||||
|
||||
{
|
||||
const CHARSET_INFO *cs= thd->charset();
|
||||
/*
|
||||
We cannot ask for parsing a statement using a character set
|
||||
without state_maps (parser internal data).
|
||||
*/
|
||||
if (!cs->state_map)
|
||||
{
|
||||
rli->report(ERROR_LEVEL, ER_SLAVE_FATAL_ERROR,
|
||||
ER_THD(thd, ER_SLAVE_FATAL_ERROR),
|
||||
"character_set cannot be parsed");
|
||||
thd->is_slave_error= true;
|
||||
goto end;
|
||||
}
|
||||
}
|
||||
|
||||
thd->table_map_for_update= (table_map)table_map_for_update;
|
||||
thd->set_invoker(&user, &host);
|
||||
/*
|
||||
@ -4281,7 +4330,13 @@ int Start_log_event_v3::do_apply_event(Relay_log_info const *rli)
|
||||
*/
|
||||
break;
|
||||
default:
|
||||
/* this case is impossible */
|
||||
/*
|
||||
This case is not expected. It can be either an event corruption or an
|
||||
unsupported binary log version.
|
||||
*/
|
||||
rli->report(ERROR_LEVEL, ER_SLAVE_FATAL_ERROR,
|
||||
ER_THD(thd, ER_SLAVE_FATAL_ERROR),
|
||||
"Binlog version not supported");
|
||||
DBUG_RETURN(1);
|
||||
}
|
||||
DBUG_RETURN(error);
|
||||
@ -5207,6 +5262,9 @@ int Load_log_event::copy_log_event(const char *buf, ulong event_len,
|
||||
|
||||
fields = (char*)field_lens + num_fields;
|
||||
table_name = fields + field_block_len;
|
||||
if (strlen(table_name) > NAME_LEN)
|
||||
goto err;
|
||||
|
||||
db = table_name + table_name_len + 1;
|
||||
DBUG_EXECUTE_IF ("simulate_invalid_address",
|
||||
db_len = data_len;);
|
||||
@ -6417,6 +6475,13 @@ User_var_log_event(const char* buf, uint event_len,
|
||||
buf+= description_event->common_header_len +
|
||||
description_event->post_header_len[USER_VAR_EVENT-1];
|
||||
name_len= uint4korr(buf);
|
||||
/* Avoid reading out of buffer */
|
||||
if ((buf - buf_start) + UV_NAME_LEN_SIZE + name_len > event_len)
|
||||
{
|
||||
error= true;
|
||||
goto err;
|
||||
}
|
||||
|
||||
name= (char *) buf + UV_NAME_LEN_SIZE;
|
||||
|
||||
/*
|
||||
@ -6476,6 +6541,11 @@ User_var_log_event(const char* buf, uint event_len,
|
||||
we keep the flags set to UNDEF_F.
|
||||
*/
|
||||
uint bytes_read= ((val + val_len) - start);
|
||||
if (bytes_read > event_len)
|
||||
{
|
||||
error= true;
|
||||
goto err;
|
||||
}
|
||||
if ((data_written - bytes_read) > 0)
|
||||
{
|
||||
flags= (uint) *(buf + UV_VAL_IS_NULL + UV_VAL_TYPE_SIZE +
|
||||
@ -6690,7 +6760,12 @@ int User_var_log_event::do_apply_event(Relay_log_info const *rli)
|
||||
}
|
||||
|
||||
if (!(charset= get_charset(charset_number, MYF(MY_WME))))
|
||||
{
|
||||
rli->report(ERROR_LEVEL, ER_SLAVE_FATAL_ERROR,
|
||||
ER_THD(thd, ER_SLAVE_FATAL_ERROR),
|
||||
"Invalid character set for User var event");
|
||||
DBUG_RETURN(1);
|
||||
}
|
||||
LEX_STRING user_var_name;
|
||||
user_var_name.str= name;
|
||||
user_var_name.length= name_len;
|
||||
@ -6711,12 +6786,26 @@ int User_var_log_event::do_apply_event(Relay_log_info const *rli)
|
||||
{
|
||||
switch (type) {
|
||||
case REAL_RESULT:
|
||||
if (val_len != 8)
|
||||
{
|
||||
rli->report(ERROR_LEVEL, ER_SLAVE_FATAL_ERROR,
|
||||
ER_THD(thd, ER_SLAVE_FATAL_ERROR),
|
||||
"Invalid variable length at User var event");
|
||||
return 1;
|
||||
}
|
||||
float8get(real_val, val);
|
||||
it= new Item_float(real_val, 0);
|
||||
val= (char*) &real_val; // Pointer to value in native format
|
||||
val_len= 8;
|
||||
break;
|
||||
case INT_RESULT:
|
||||
if (val_len != 8)
|
||||
{
|
||||
rli->report(ERROR_LEVEL, ER_SLAVE_FATAL_ERROR,
|
||||
ER_THD(thd, ER_SLAVE_FATAL_ERROR),
|
||||
"Invalid variable length at User var event");
|
||||
return 1;
|
||||
}
|
||||
int_val= (longlong) uint8korr(val);
|
||||
it= new Item_int(int_val);
|
||||
val= (char*) &int_val; // Pointer to value in native format
|
||||
@ -6724,6 +6813,13 @@ int User_var_log_event::do_apply_event(Relay_log_info const *rli)
|
||||
break;
|
||||
case DECIMAL_RESULT:
|
||||
{
|
||||
if (val_len < 3)
|
||||
{
|
||||
rli->report(ERROR_LEVEL, ER_SLAVE_FATAL_ERROR,
|
||||
ER_THD(thd, ER_SLAVE_FATAL_ERROR),
|
||||
"Invalid variable length at User var event");
|
||||
return 1;
|
||||
}
|
||||
Item_decimal *dec= new Item_decimal((uchar*) val+2, val[0], val[1]);
|
||||
it= dec;
|
||||
val= (char *)dec->val_decimal(NULL);
|
||||
@ -8177,6 +8273,15 @@ Rows_log_event::Rows_log_event(const char *buf, uint event_len,
|
||||
DBUG_PRINT("debug", ("Reading from %p", ptr_after_width));
|
||||
m_width = net_field_length(&ptr_after_width);
|
||||
DBUG_PRINT("debug", ("m_width=%lu", m_width));
|
||||
/* Avoid reading out of buffer */
|
||||
if (static_cast<unsigned int>((ptr_after_width +
|
||||
(m_width + 7) / 8) -
|
||||
(uchar*)buf) > event_len)
|
||||
{
|
||||
m_cols.bitmap= NULL;
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
|
||||
/* if bitmap_init fails, catched in is_valid() */
|
||||
if (likely(!bitmap_init(&m_cols,
|
||||
m_width <= sizeof(m_bitbuf)*8 ? m_bitbuf : NULL,
|
||||
@ -8225,7 +8330,12 @@ Rows_log_event::Rows_log_event(const char *buf, uint event_len,
|
||||
|
||||
const uchar* const ptr_rows_data= (const uchar*) ptr_after_width;
|
||||
|
||||
size_t const data_size= event_len - (ptr_rows_data - (const uchar *) buf);
|
||||
size_t const read_size= ptr_rows_data - (const unsigned char *) buf;
|
||||
if (read_size > event_len)
|
||||
{
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
size_t const data_size= event_len - read_size;
|
||||
DBUG_PRINT("info",("m_table_id: %lu m_flags: %d m_width: %lu data_size: %lu",
|
||||
m_table_id, m_flags, m_width, (ulong) data_size));
|
||||
|
||||
|
@ -1,4 +1,5 @@
|
||||
/* Copyright (c) 2007, 2016, Oracle and/or its affiliates.
|
||||
/* Copyright (c) 2007, 2018, Oracle and/or its affiliates.
|
||||
Copyright (c) 2009, 2018, 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
|
||||
@ -1357,6 +1358,15 @@ Old_rows_log_event::Old_rows_log_event(const char *buf, uint event_len,
|
||||
DBUG_PRINT("debug", ("Reading from %p", ptr_after_width));
|
||||
m_width = net_field_length(&ptr_after_width);
|
||||
DBUG_PRINT("debug", ("m_width=%lu", m_width));
|
||||
/* Avoid reading out of buffer */
|
||||
if (static_cast<unsigned int>(m_width +
|
||||
(ptr_after_width -
|
||||
(const uchar *)buf)) > event_len)
|
||||
{
|
||||
m_cols.bitmap= NULL;
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
|
||||
/* if bitmap_init fails, catched in is_valid() */
|
||||
if (likely(!bitmap_init(&m_cols,
|
||||
m_width <= sizeof(m_bitbuf)*8 ? m_bitbuf : NULL,
|
||||
|
@ -1,5 +1,5 @@
|
||||
/* Copyright (c) 2000, 2015, Oracle and/or its affiliates.
|
||||
Copyright (c) 2008, 2015, SkySQL Ab.
|
||||
Copyright (c) 2008, 2018, 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
|
||||
@ -3627,7 +3627,7 @@ static int init_common_variables()
|
||||
/* TODO: remove this when my_time_t is 64 bit compatible */
|
||||
if (!IS_TIME_T_VALID_FOR_TIMESTAMP(server_start_time))
|
||||
{
|
||||
sql_print_error("This MySQL server doesn't support dates later then 2038");
|
||||
sql_print_error("This MySQL server doesn't support dates later than 2038");
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
@ -2651,7 +2651,7 @@ public:
|
||||
/* Table read plans are allocated on MEM_ROOT and are never deleted */
|
||||
static void *operator new(size_t size, MEM_ROOT *mem_root)
|
||||
{ return (void*) alloc_root(mem_root, (uint) size); }
|
||||
static void operator delete(void *ptr,size_t size) { TRASH(ptr, size); }
|
||||
static void operator delete(void *ptr,size_t size) { TRASH_FREE(ptr, size); }
|
||||
static void operator delete(void *ptr, MEM_ROOT *mem_root) { /* Never called */ }
|
||||
virtual ~TABLE_READ_PLAN() {} /* Remove gcc warning */
|
||||
|
||||
|
@ -873,8 +873,10 @@ 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.
|
||||
Make sure that the length of the key for the temp_table is atleast
|
||||
greater than 0.
|
||||
*/
|
||||
if (total_key_length > tmp_table_max_key_length() ||
|
||||
if (!total_key_length || total_key_length > tmp_table_max_key_length() ||
|
||||
elements > tmp_table_max_key_parts())
|
||||
DBUG_RETURN(FALSE);
|
||||
|
||||
@ -1004,6 +1006,10 @@ bool check_for_outer_joins(List<TABLE_LIST> *join_list)
|
||||
void find_and_block_conversion_to_sj(Item *to_find,
|
||||
List_iterator_fast<Item_in_subselect> &li)
|
||||
{
|
||||
if (to_find->type() == Item::FUNC_ITEM &&
|
||||
((Item_func*)to_find)->functype() == Item_func::IN_OPTIMIZER_FUNC)
|
||||
to_find= ((Item_in_optimizer*)to_find)->get_wrapped_in_subselect_item();
|
||||
|
||||
if (to_find->type() != Item::SUBSELECT_ITEM ||
|
||||
((Item_subselect *) to_find)->substype() != Item_subselect::IN_SUBS)
|
||||
return;
|
||||
@ -5897,5 +5903,6 @@ bool JOIN::choose_tableless_subquery_plan()
|
||||
tmp_having= having;
|
||||
}
|
||||
}
|
||||
exec_const_cond= conds;
|
||||
return FALSE;
|
||||
}
|
||||
|
@ -1,6 +1,6 @@
|
||||
/*
|
||||
Copyright (c) 2002, 2016, Oracle and/or its affiliates.
|
||||
Copyright (c) 2009, 2017, MariaDB
|
||||
Copyright (c) 2002, 2018, Oracle and/or its affiliates.
|
||||
Copyright (c) 2009, 2018, 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
|
||||
@ -354,7 +354,7 @@ private:
|
||||
bool m_print_once;
|
||||
|
||||
public:
|
||||
Proc_table_intact() : m_print_once(TRUE) {}
|
||||
Proc_table_intact() : m_print_once(TRUE) { has_keys= TRUE; }
|
||||
|
||||
protected:
|
||||
void report_error(uint code, const char *fmt, ...);
|
||||
|
@ -1,5 +1,5 @@
|
||||
/* Copyright (c) 2000, 2016, Oracle and/or its affiliates.
|
||||
Copyright (c) 2009, 2016, MariaDB
|
||||
Copyright (c) 2009, 2018, 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) 2010, 2015, Oracle and/or its affiliates.
|
||||
Copyright (c) 2011, 2016, MariaDB
|
||||
Copyright (c) 2011, 2018, 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,4 +1,6 @@
|
||||
/* Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved.
|
||||
Copyright (c) 2011, 2018, 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
|
||||
|
@ -2497,6 +2497,7 @@ void Query_cache::init()
|
||||
*/
|
||||
if (global_system_variables.query_cache_type == 0)
|
||||
{
|
||||
m_cache_status= DISABLE_REQUEST;
|
||||
free_cache();
|
||||
m_cache_status= DISABLED;
|
||||
}
|
||||
|
@ -2486,6 +2486,9 @@ void THD::check_and_register_item_tree_change(Item **place, Item **new_value,
|
||||
MEM_ROOT *runtime_memroot)
|
||||
{
|
||||
Item_change_record *change;
|
||||
DBUG_ENTER("THD::check_and_register_item_tree_change");
|
||||
DBUG_PRINT("enter", ("Register: %p (%p) <- %p (%p)",
|
||||
*place, place, *new_value, new_value));
|
||||
I_List_iterator<Item_change_record> it(change_list);
|
||||
while ((change= it++))
|
||||
{
|
||||
@ -2495,19 +2498,20 @@ void THD::check_and_register_item_tree_change(Item **place, Item **new_value,
|
||||
if (change)
|
||||
nocheck_register_item_tree_change(place, change->old_value,
|
||||
runtime_memroot);
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
|
||||
|
||||
void THD::rollback_item_tree_changes()
|
||||
{
|
||||
DBUG_ENTER("THD::rollback_item_tree_changes");
|
||||
I_List_iterator<Item_change_record> it(change_list);
|
||||
Item_change_record *change;
|
||||
DBUG_ENTER("rollback_item_tree_changes");
|
||||
|
||||
while ((change= it++))
|
||||
{
|
||||
DBUG_PRINT("info", ("revert %p -> %p",
|
||||
change->old_value, (*change->place)));
|
||||
DBUG_PRINT("info", ("Rollback: %p (%p) <- %p",
|
||||
*change->place, change->place, change->old_value));
|
||||
*change->place= change->old_value;
|
||||
}
|
||||
/* We can forget about changes memory: it's allocated in runtime memroot */
|
||||
|
@ -2786,10 +2786,14 @@ public:
|
||||
|
||||
void change_item_tree(Item **place, Item *new_value)
|
||||
{
|
||||
DBUG_ENTER("THD::change_item_tree");
|
||||
DBUG_PRINT("enter", ("Register: %p (%p) <- %p",
|
||||
*place, place, new_value));
|
||||
/* TODO: check for OOM condition here */
|
||||
if (!stmt_arena->is_conventional())
|
||||
nocheck_register_item_tree_change(place, *place, mem_root);
|
||||
*place= new_value;
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
/**
|
||||
Make change in item tree after checking whether it needs registering
|
||||
|
@ -187,7 +187,7 @@ void Server_side_cursor::operator delete(void *ptr, size_t size)
|
||||
MEM_ROOT own_root= *cursor->mem_root;
|
||||
|
||||
DBUG_ENTER("Server_side_cursor::operator delete");
|
||||
TRASH(ptr, size);
|
||||
TRASH_FREE(ptr, size);
|
||||
/*
|
||||
If this cursor has never been opened mem_root is empty. Otherwise
|
||||
mem_root points to the memory the cursor object was allocated in.
|
||||
|
@ -366,7 +366,11 @@ bool mysql_derived_merge(THD *thd, LEX *lex, TABLE_LIST *derived)
|
||||
derived->get_unit()));
|
||||
|
||||
if (derived->merged)
|
||||
{
|
||||
|
||||
DBUG_PRINT("info", ("Irreversibly merged: exit"));
|
||||
DBUG_RETURN(FALSE);
|
||||
}
|
||||
|
||||
if (dt_select->uncacheable & UNCACHEABLE_RAND)
|
||||
{
|
||||
@ -667,6 +671,17 @@ bool mysql_derived_prepare(THD *thd, LEX *lex, TABLE_LIST *derived)
|
||||
|
||||
unit->derived= derived;
|
||||
|
||||
/*
|
||||
Above cascade call of prepare is important for PS protocol, but after it
|
||||
is called we can check if we really need prepare for this derived
|
||||
*/
|
||||
if (derived->merged)
|
||||
{
|
||||
DBUG_PRINT("info", ("Irreversibly merged: exit"));
|
||||
DBUG_RETURN(FALSE);
|
||||
}
|
||||
|
||||
|
||||
derived->fill_me= FALSE;
|
||||
|
||||
if (!(derived->derived_result= new select_union))
|
||||
@ -795,6 +810,11 @@ bool mysql_derived_optimize(THD *thd, LEX *lex, TABLE_LIST *derived)
|
||||
DBUG_PRINT("enter", ("Alias: '%s' Unit: %p",
|
||||
(derived->alias ? derived->alias : "<NULL>"),
|
||||
derived->get_unit()));
|
||||
if (derived->merged)
|
||||
{
|
||||
DBUG_PRINT("info", ("Irreversibly merged: exit"));
|
||||
DBUG_RETURN(FALSE);
|
||||
}
|
||||
|
||||
if (unit->optimized)
|
||||
DBUG_RETURN(FALSE);
|
||||
|
@ -548,7 +548,7 @@ public:
|
||||
}
|
||||
static void *operator new(size_t size, MEM_ROOT *mem_root) throw ()
|
||||
{ return (void*) alloc_root(mem_root, (uint) size); }
|
||||
static void operator delete(void *ptr,size_t size) { TRASH(ptr, size); }
|
||||
static void operator delete(void *ptr,size_t size) { TRASH_FREE(ptr, size); }
|
||||
static void operator delete(void *ptr, MEM_ROOT *mem_root) {}
|
||||
|
||||
// Ensures that at least all members used during cleanup() are initialized.
|
||||
@ -2949,7 +2949,7 @@ struct st_lex_local: public LEX
|
||||
return (void*) alloc_root(mem_root, (uint) size);
|
||||
}
|
||||
static void operator delete(void *ptr,size_t size)
|
||||
{ TRASH(ptr, size); }
|
||||
{ TRASH_FREE(ptr, size); }
|
||||
static void operator delete(void *ptr, MEM_ROOT *mem_root)
|
||||
{ /* Never called */ }
|
||||
};
|
||||
|
@ -84,7 +84,7 @@ public:
|
||||
start= start_arg;
|
||||
end= end_arg;
|
||||
if (end != start)
|
||||
TRASH(start, end - start);
|
||||
TRASH_ALLOC(start, end - start);
|
||||
reset();
|
||||
}
|
||||
|
||||
@ -224,7 +224,7 @@ public:
|
||||
{
|
||||
DBUG_ASSERT(unused_end >= unused_start);
|
||||
DBUG_ASSERT(end == unused_start);
|
||||
TRASH(unused_start, unused_end - unused_start);
|
||||
TRASH_ALLOC(unused_start, unused_end - unused_start);
|
||||
end= unused_end;
|
||||
}
|
||||
/* Return pointer to start of the memory area that is occupied by the data */
|
||||
|
@ -41,12 +41,12 @@ public:
|
||||
{ return alloc_root(mem_root, size); }
|
||||
static void *operator new(size_t size, MEM_ROOT *mem_root) throw ()
|
||||
{ return alloc_root(mem_root, size); }
|
||||
static void operator delete(void *ptr, size_t size) { TRASH(ptr, size); }
|
||||
static void operator delete(void *ptr, size_t size) { TRASH_FREE(ptr, size); }
|
||||
static void operator delete(void *ptr, MEM_ROOT *mem_root)
|
||||
{ /* never called */ }
|
||||
static void operator delete[](void *ptr, MEM_ROOT *mem_root)
|
||||
{ /* never called */ }
|
||||
static void operator delete[](void *ptr, size_t size) { TRASH(ptr, size); }
|
||||
static void operator delete[](void *ptr, size_t size) { TRASH_FREE(ptr, size); }
|
||||
#ifdef HAVE_valgrind
|
||||
bool dummy;
|
||||
inline Sql_alloc() :dummy(0) {}
|
||||
|
@ -1,5 +1,5 @@
|
||||
/* Copyright (c) 2005, 2017, Oracle and/or its affiliates.
|
||||
Copyright (c) 2009, 2017, SkySQL Ab.
|
||||
Copyright (c) 2009, 2018, 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
|
||||
@ -283,7 +283,7 @@ bool partition_default_handling(TABLE *table, partition_info *part_info,
|
||||
}
|
||||
}
|
||||
part_info->set_up_defaults_for_partitioning(table->file,
|
||||
(ulonglong)0, (uint)0);
|
||||
NULL, (uint)0);
|
||||
DBUG_RETURN(FALSE);
|
||||
}
|
||||
|
||||
|
@ -1,6 +1,6 @@
|
||||
/*
|
||||
Copyright (c) 2005, 2013, Oracle and/or its affiliates.
|
||||
Copyright (c) 2010, 2014, SkySQL Ab.
|
||||
Copyright (c) 2005, 2018, Oracle and/or its affiliates.
|
||||
Copyright (c) 2010, 2018, 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
|
||||
@ -267,7 +267,7 @@ public:
|
||||
static void *operator new(size_t size, MEM_ROOT *mem_root)
|
||||
{ return (void*) alloc_root(mem_root, size); }
|
||||
static void operator delete(void *ptr_arg,size_t size)
|
||||
{ TRASH(ptr_arg, size); }
|
||||
{ TRASH_FREE(ptr_arg, size); }
|
||||
|
||||
sys_var_pluginvar(sys_var_chain *chain, const char *name_arg,
|
||||
struct st_mysql_sys_var *plugin_var_arg,
|
||||
@ -477,6 +477,11 @@ static st_plugin_dl *plugin_dl_insert_or_reuse(struct st_plugin_dl *plugin_dl)
|
||||
sizeof(struct st_plugin_dl));
|
||||
DBUG_RETURN(tmp);
|
||||
}
|
||||
#else
|
||||
static struct st_plugin_dl *plugin_dl_find(const LEX_STRING *)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
#endif /* HAVE_DLOPEN */
|
||||
|
||||
|
||||
@ -2247,6 +2252,16 @@ bool mysql_uninstall_plugin(THD *thd, const LEX_STRING *name,
|
||||
if (! (table= open_ltable(thd, &tables, TL_WRITE, MYSQL_LOCK_IGNORE_TIMEOUT)))
|
||||
DBUG_RETURN(TRUE);
|
||||
|
||||
if (!table->key_info)
|
||||
{
|
||||
my_printf_error(ER_UNKNOWN_ERROR,
|
||||
"The table %s.%s has no primary key. "
|
||||
"Please check the table definition and "
|
||||
"create the primary key accordingly.", MYF(0),
|
||||
table->s->db.str, table->s->table_name.str);
|
||||
DBUG_RETURN(TRUE);
|
||||
}
|
||||
|
||||
/*
|
||||
Pre-acquire audit plugins for events that may potentially occur
|
||||
during [UN]INSTALL PLUGIN.
|
||||
|
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