Merge branch '10.2' into 10.3
This commit is contained in:
commit
0ab1e3914c
265
mysql-test/lib/My/Debugger.pm
Normal file
265
mysql-test/lib/My/Debugger.pm
Normal file
@ -0,0 +1,265 @@
|
|||||||
|
package My::Debugger;
|
||||||
|
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
use Text::Wrap;
|
||||||
|
use Cwd;
|
||||||
|
use My::Platform;
|
||||||
|
|
||||||
|
# 1. options to support:
|
||||||
|
# --xxx[=ARGS]
|
||||||
|
# --manual-xxx[=ARGS]
|
||||||
|
# --client-xxx[=ARGS]
|
||||||
|
# --boot-xxx[=ARGS]
|
||||||
|
# TODO --manual-client-xxx[=ARGS]
|
||||||
|
# TODO --manual-boot-xxx[=ARGS]
|
||||||
|
# TODO --exec-xxx[=ARGS] (for $ENV{MYSQL}, etc)
|
||||||
|
#
|
||||||
|
# ARGS is a semicolon-separated list of commands for the
|
||||||
|
# command file. If the first command starts from '-' it'll
|
||||||
|
# be for a command line, not for a command file.
|
||||||
|
#
|
||||||
|
# 2. terminal to use: xterm
|
||||||
|
# TODO MTR_TERM="xterm -title {title} -e {command}"
|
||||||
|
#
|
||||||
|
# 3. debugger combinations are *not allowed*
|
||||||
|
# (thus no --valgrind --gdb)
|
||||||
|
#
|
||||||
|
# 4. variables for the command line / file templates:
|
||||||
|
# {vardir} -> vardir
|
||||||
|
# {exe} -> /path/to/binary/to/execute
|
||||||
|
# {args} -> command-line arguments, "-quoted
|
||||||
|
# {input}
|
||||||
|
# {type} -> client, mysqld.1, etc
|
||||||
|
# {script} -> vardir/tmp/{debugger}init.$type
|
||||||
|
# {log} -> vardir/log/$type.{debugger}
|
||||||
|
# {options} -> user options for the debugger.
|
||||||
|
#
|
||||||
|
# if {options} isn't used, they're auto-placed before {exe}
|
||||||
|
# or at the end if no {exe}
|
||||||
|
|
||||||
|
my %debuggers = (
|
||||||
|
gdb => {
|
||||||
|
term => 1,
|
||||||
|
options => '-x {script} {exe}',
|
||||||
|
script => 'set args {args} < {input}',
|
||||||
|
},
|
||||||
|
ddd => {
|
||||||
|
options => '--command {script} {exe}',
|
||||||
|
script => 'set args {args} < {input}',
|
||||||
|
},
|
||||||
|
dbx => {
|
||||||
|
term => 1,
|
||||||
|
options => '-c "stop in main; run {exe} {args} < {input}"',
|
||||||
|
},
|
||||||
|
devenv => {
|
||||||
|
options => '/debugexe {exe} {args}',
|
||||||
|
},
|
||||||
|
windbg => {
|
||||||
|
options => '{exe} {args}',
|
||||||
|
},
|
||||||
|
lldb => {
|
||||||
|
term => 1,
|
||||||
|
options => '-s {script} {exe}',
|
||||||
|
script => 'process launch --stop-at-entry {args}',
|
||||||
|
},
|
||||||
|
valgrind => {
|
||||||
|
options => '--tool=memcheck --show-reachable=yes --leak-check=yes --num-callers=16 --quiet --suppressions='.cwd().'/valgrind.supp {exe} {args} --loose-wait-for-pos-timeout=1500',
|
||||||
|
pre => sub {
|
||||||
|
my $debug_libraries_path= "/usr/lib/debug";
|
||||||
|
$ENV{LD_LIBRARY_PATH} .= ":$debug_libraries_path" if -d $debug_libraries_path;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
strace => {
|
||||||
|
options => '-f -o {log} {exe} {args}',
|
||||||
|
},
|
||||||
|
rr => {
|
||||||
|
options => 'record -o {log} {exe} {args}',
|
||||||
|
pre => sub {
|
||||||
|
::mtr_error('rr requires kernel.perf_event_paranoid <= 1')
|
||||||
|
if ::mtr_grab_file('/proc/sys/kernel/perf_event_paranoid') > 1;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
valgdb => {
|
||||||
|
term => 1,
|
||||||
|
run => 'gdb',
|
||||||
|
options => '-x {script} {exe}',
|
||||||
|
script => <<EEE,
|
||||||
|
py
|
||||||
|
import subprocess,shlex,time
|
||||||
|
valg=subprocess.Popen(shlex.split("""valgrind --tool=memcheck --show-reachable=yes --leak-check=yes --num-callers=16 --quiet --suppressions=valgrind.supp --vgdb-error=0 {exe} {args} --loose-wait-for-pos-timeout=1500"""))
|
||||||
|
time.sleep(2)
|
||||||
|
gdb.execute("target remote | /usr/lib64/valgrind/../../bin/vgdb --pid=" + str(valg.pid))
|
||||||
|
EEE
|
||||||
|
pre => sub {
|
||||||
|
my $debug_libraries_path= "/usr/lib/debug";
|
||||||
|
$ENV{LD_LIBRARY_PATH} .= ":$debug_libraries_path" if -d $debug_libraries_path;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
# aliases
|
||||||
|
vsjitdebugger => 'windbg',
|
||||||
|
ktrace => 'strace',
|
||||||
|
);
|
||||||
|
|
||||||
|
my %opts;
|
||||||
|
my %opt_vals;
|
||||||
|
my $help = "\n\nOptions for running debuggers\n\n";
|
||||||
|
|
||||||
|
for my $k (sort keys %debuggers) {
|
||||||
|
my $v = $debuggers{$k};
|
||||||
|
$v = $debuggers{$k} = $debuggers{$v} if not ref $v; # resolve aliases
|
||||||
|
|
||||||
|
sub register_opt($$) {
|
||||||
|
my ($name, $msg) = @_;
|
||||||
|
$opts{"$name=s"} = \$opt_vals{$name};
|
||||||
|
$help .= wrap(sprintf(" %-23s", $name), ' 'x25, "$msg under $name\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
$v->{script} = '' unless $v->{script};
|
||||||
|
$v->{options} =~ s/(\{exe\}|$)/ {options} $&/ unless $v->{options} =~ /\{options\}/;
|
||||||
|
|
||||||
|
register_opt "$k" => "Start mysqld";
|
||||||
|
register_opt "client-$k" => "Start mysqltest client";
|
||||||
|
register_opt "boot-$k" => "Start bootstrap server";
|
||||||
|
register_opt "manual-$k" => "Before running test(s) let user manually start mysqld";
|
||||||
|
}
|
||||||
|
|
||||||
|
sub subst($%) {
|
||||||
|
use warnings FATAL => 'uninitialized';
|
||||||
|
my ($templ, %vars) = @_;
|
||||||
|
$templ =~ s/\{(\w+)\}/$vars{$1}/g;
|
||||||
|
$templ;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub do_args($$$$$) {
|
||||||
|
my ($args, $exe, $input, $type, $opt) = @_;
|
||||||
|
my $k = $opt =~ /^(?:client|boot|manual)-(.*)$/ ? $1 : $opt;
|
||||||
|
my $v = $debuggers{$k};
|
||||||
|
|
||||||
|
# on windows mtr args are quoted (for system), otherwise not (for exec)
|
||||||
|
sub quote($) { $_[0] =~ / / ? "\"$_[0]\"" : $_[0] }
|
||||||
|
sub unquote($) { $_[0] =~ s/^"(.*)"$/$1/; $_[0] }
|
||||||
|
sub quote_from_mtr($) { IS_WINDOWS() ? $_[0] : quote($_[0]) }
|
||||||
|
sub unquote_for_mtr($) { IS_WINDOWS() ? $_[0] : unquote($_[0]) }
|
||||||
|
|
||||||
|
my %vars = (
|
||||||
|
vardir => $::opt_vardir,
|
||||||
|
exe => $$exe,
|
||||||
|
args => join(' ', map { quote_from_mtr $_ } @$$args, '--gdb'),
|
||||||
|
input => $input,
|
||||||
|
script => "$::opt_vardir/tmp/${k}init.$type",
|
||||||
|
log => "$::opt_vardir/log/$type.$k",
|
||||||
|
options => '',
|
||||||
|
);
|
||||||
|
my @params = split /;/, $opt_vals{$opt};
|
||||||
|
$vars{options} = shift @params if @params and $params[0] =~ /^-/;
|
||||||
|
|
||||||
|
my $script = join "\n", @params;
|
||||||
|
if ($v->{script}) {
|
||||||
|
::mtr_tofile($vars{script}, subst($v->{script}, %vars)."\n".$script);
|
||||||
|
} elsif ($script) {
|
||||||
|
die "$k is not using a script file, nowhere to write the script \n---\n$script\n---\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
my $options = subst($v->{options}, %vars);
|
||||||
|
@$$args = map { unquote_for_mtr $_ } $options =~ /("[^"]+"|\S+)/g;
|
||||||
|
my $run = $v->{run} || $k;
|
||||||
|
|
||||||
|
if ($opt =~ /^manual-/) {
|
||||||
|
print "\nTo start $k for $type, type in another window:\n";
|
||||||
|
print "$run $options\n";
|
||||||
|
$$exe= undef; # Indicate the exe should not be started
|
||||||
|
} elsif ($v->{term}) {
|
||||||
|
unshift @$$args, '-title', $type, '-e', $run;
|
||||||
|
$$exe = 'xterm';
|
||||||
|
} else {
|
||||||
|
$$exe = $run;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sub options() { %opts }
|
||||||
|
sub help() { $help }
|
||||||
|
|
||||||
|
sub fix_options(@) {
|
||||||
|
my $re=join '|', keys %opts;
|
||||||
|
$re =~ s/=s//g;
|
||||||
|
map { $_ . (/^--($re)$/ and '=;') } @_;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub pre_setup() {
|
||||||
|
my $used;
|
||||||
|
for my $k (keys %debuggers) {
|
||||||
|
for my $opt ($k, "manual-$k", "boot-$k", "client-$k") {
|
||||||
|
if ($opt_vals{$opt})
|
||||||
|
{
|
||||||
|
$used = 1;
|
||||||
|
if ($debuggers{$k}->{pre}) {
|
||||||
|
$debuggers{$k}->{pre}->();
|
||||||
|
delete $debuggers{$k}->{pre};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($used) {
|
||||||
|
$ENV{ASAN_OPTIONS}= 'abort_on_error=1:'.($ENV{ASAN_OPTIONS} || '');
|
||||||
|
::mtr_error("Can't use --extern when using debugger") if $ENV{USE_RUNNING_SERVER};
|
||||||
|
|
||||||
|
$::opt_retry= 1;
|
||||||
|
$::opt_retry_failure= 1;
|
||||||
|
$::opt_testcase_timeout= 7 * 24 * 60; # in minutes
|
||||||
|
$::opt_suite_timeout= 7 * 24 * 60; # in minutes
|
||||||
|
$::opt_shutdown_timeout= 24 * 60 *60; # in seconds
|
||||||
|
$::opt_start_timeout= 24 * 60 * 60; # in seconds
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sub setup_boot_args($$$) {
|
||||||
|
my ($args, $exe, $input) = @_;
|
||||||
|
my $found;
|
||||||
|
|
||||||
|
for my $k (keys %debuggers) {
|
||||||
|
if ($opt_vals{"boot-$k"}) {
|
||||||
|
die "--boot-$k and --$found cannot be used at the same time\n" if $found;
|
||||||
|
|
||||||
|
$found="boot-$k";
|
||||||
|
do_args($args, $exe, $input, 'bootstrap', $found);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sub setup_client_args($$) {
|
||||||
|
my ($args, $exe) = @_;
|
||||||
|
my $found;
|
||||||
|
my $embedded = $::opt_embedded_server ? ' with --embedded' : '';
|
||||||
|
|
||||||
|
for my $k (keys %debuggers) {
|
||||||
|
my @opt_names=("client-$k");
|
||||||
|
push @opt_names, $k if $embedded;
|
||||||
|
for my $opt (@opt_names) {
|
||||||
|
if ($opt_vals{$opt}) {
|
||||||
|
die "--$opt and --$found cannot be used at the same time$embedded\n" if $found;
|
||||||
|
$found=$opt;
|
||||||
|
do_args($args, $exe, IS_WINDOWS() ? 'NUL' : '/dev/null', 'client', $found);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sub setup_args($$$) {
|
||||||
|
my ($args, $exe, $type) = @_;
|
||||||
|
my $found;
|
||||||
|
|
||||||
|
for my $k (keys %debuggers) {
|
||||||
|
for my $opt ($k, "manual-$k") {
|
||||||
|
if ($opt_vals{$opt}) {
|
||||||
|
die "--$opt and --$found cannot be used at the same time\n" if $found;
|
||||||
|
$found=$opt;
|
||||||
|
do_args($args, $exe, IS_WINDOWS() ? 'NUL' : '/dev/null', $type, $found);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
1;
|
@ -790,3 +790,19 @@ EXPLAIN
|
|||||||
}
|
}
|
||||||
drop table t1;
|
drop table t1;
|
||||||
SET optimizer_use_condition_selectivity=@save_optimizer_use_condition_selectivity;
|
SET optimizer_use_condition_selectivity=@save_optimizer_use_condition_selectivity;
|
||||||
|
#
|
||||||
|
# MDEV-11172: EXPLAIN shows non-sensical value for key_len with type=index
|
||||||
|
#
|
||||||
|
CREATE TABLE t1(a INT);
|
||||||
|
INSERT INTO t1 VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
|
||||||
|
CREATE TABLE t2 (
|
||||||
|
pk VARCHAR(50),
|
||||||
|
a VARCHAR(20),
|
||||||
|
KEY k1(a),
|
||||||
|
PRIMARY KEY(pk)
|
||||||
|
)ENGINE=INNODB;
|
||||||
|
INSERT INTO t2 SELECT a,a FROM t1;
|
||||||
|
EXPLAIN SELECT pk FROM t2 FORCE INDEX(k1);
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 SIMPLE t2 index NULL k1 23 NULL 10 Using index
|
||||||
|
DROP TABLE t1,t2;
|
||||||
|
@ -606,3 +606,22 @@ explain format= json
|
|||||||
select * from t1 force index(k1) where f2 <= 5 and pk2 <=5 and pk1 = 'abc' and f1 <= '3';
|
select * from t1 force index(k1) where f2 <= 5 and pk2 <=5 and pk1 = 'abc' and f1 <= '3';
|
||||||
drop table t1;
|
drop table t1;
|
||||||
SET optimizer_use_condition_selectivity=@save_optimizer_use_condition_selectivity;
|
SET optimizer_use_condition_selectivity=@save_optimizer_use_condition_selectivity;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-11172: EXPLAIN shows non-sensical value for key_len with type=index
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
CREATE TABLE t1(a INT);
|
||||||
|
INSERT INTO t1 VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
|
||||||
|
|
||||||
|
CREATE TABLE t2 (
|
||||||
|
pk VARCHAR(50),
|
||||||
|
a VARCHAR(20),
|
||||||
|
KEY k1(a),
|
||||||
|
PRIMARY KEY(pk)
|
||||||
|
)ENGINE=INNODB;
|
||||||
|
|
||||||
|
INSERT INTO t2 SELECT a,a FROM t1;
|
||||||
|
EXPLAIN SELECT pk FROM t2 FORCE INDEX(k1);
|
||||||
|
|
||||||
|
DROP TABLE t1,t2;
|
||||||
|
@ -5467,5 +5467,17 @@ ERROR HY000: Default/ignore value is not supported for such parameter usage
|
|||||||
EXECUTE IMMEDIATE 'SHOW DATABASES WHERE ?' USING 0;
|
EXECUTE IMMEDIATE 'SHOW DATABASES WHERE ?' USING 0;
|
||||||
Database
|
Database
|
||||||
#
|
#
|
||||||
|
# MDEV-24779: main.subselect fails in buildbot with --ps-protocol
|
||||||
|
#
|
||||||
|
CREATE TABLE t1(a INT);
|
||||||
|
PREPARE stmt FROM "SELECT EXISTS(SELECT 1 FROM t1 GROUP BY a IN (select a from t1))";
|
||||||
|
EXECUTE stmt;
|
||||||
|
EXISTS(SELECT 1 FROM t1 GROUP BY a IN (select a from t1))
|
||||||
|
0
|
||||||
|
EXECUTE stmt;
|
||||||
|
EXISTS(SELECT 1 FROM t1 GROUP BY a IN (select a from t1))
|
||||||
|
0
|
||||||
|
DROP TABLE t1;
|
||||||
|
#
|
||||||
# End of 10.2 tests
|
# End of 10.2 tests
|
||||||
#
|
#
|
||||||
|
@ -4939,6 +4939,16 @@ DROP TABLE t1;
|
|||||||
EXECUTE IMMEDIATE 'SHOW DATABASES WHERE ?' USING DEFAULT;
|
EXECUTE IMMEDIATE 'SHOW DATABASES WHERE ?' USING DEFAULT;
|
||||||
EXECUTE IMMEDIATE 'SHOW DATABASES WHERE ?' USING 0;
|
EXECUTE IMMEDIATE 'SHOW DATABASES WHERE ?' USING 0;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-24779: main.subselect fails in buildbot with --ps-protocol
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
CREATE TABLE t1(a INT);
|
||||||
|
PREPARE stmt FROM "SELECT EXISTS(SELECT 1 FROM t1 GROUP BY a IN (select a from t1))";
|
||||||
|
EXECUTE stmt;
|
||||||
|
EXECUTE stmt;
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
--echo #
|
--echo #
|
||||||
--echo # End of 10.2 tests
|
--echo # End of 10.2 tests
|
||||||
--echo #
|
--echo #
|
||||||
|
@ -1887,4 +1887,62 @@ a b
|
|||||||
set optimizer_use_condition_selectivity= @save_optimizer_use_condition_selectivity;
|
set optimizer_use_condition_selectivity= @save_optimizer_use_condition_selectivity;
|
||||||
drop table t1;
|
drop table t1;
|
||||||
# End of 10.1 tests
|
# End of 10.1 tests
|
||||||
|
#
|
||||||
|
# MDEV-22583: Selectivity for BIT columns in filtered column for EXPLAIN is incorrect
|
||||||
|
#
|
||||||
|
SET optimizer_use_condition_selectivity=4;
|
||||||
|
SET histogram_size=255;
|
||||||
|
CREATE TABLE t1 (a BIT(32), b INT);
|
||||||
|
INSERT INTO t1 VALUES (80, 80), (81, 81), (82, 82);
|
||||||
|
ANALYZE TABLE t1 PERSISTENT FOR ALL;
|
||||||
|
Table Op Msg_type Msg_text
|
||||||
|
test.t1 analyze status Engine-independent statistics collected
|
||||||
|
test.t1 analyze status OK
|
||||||
|
EXPLAIN EXTENDED SELECT * from t1 where t1.a >= 81;
|
||||||
|
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||||
|
1 SIMPLE t1 ALL NULL NULL NULL NULL 3 66.41 Using where
|
||||||
|
Warnings:
|
||||||
|
Note 1003 select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b` from `test`.`t1` where `test`.`t1`.`a` >= 81
|
||||||
|
SELECT HEX(a), b from t1 where t1.a >= 81;
|
||||||
|
HEX(a) b
|
||||||
|
51 81
|
||||||
|
52 82
|
||||||
|
set optimizer_use_condition_selectivity= @save_optimizer_use_condition_selectivity;
|
||||||
|
set histogram_size=@save_histogram_size;
|
||||||
|
DROP TABLE t1;
|
||||||
|
#
|
||||||
|
# MDEV-19474: Histogram statistics are used even with optimizer_use_condition_selectivity=3
|
||||||
|
#
|
||||||
|
CREATE TABLE t1(a int);
|
||||||
|
INSERT INTO t1 values (1),(2),(2),(3),(4);
|
||||||
|
SET optimizer_use_condition_selectivity=4;
|
||||||
|
SET histogram_size= 255;
|
||||||
|
set use_stat_tables='preferably';
|
||||||
|
ANALYZE TABLE t1 PERSISTENT FOR ALL;
|
||||||
|
Table Op Msg_type Msg_text
|
||||||
|
test.t1 analyze status Engine-independent statistics collected
|
||||||
|
test.t1 analyze status OK
|
||||||
|
EXPLAIN EXTENDED SELECT * FROM t1 WHERE a=2;
|
||||||
|
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||||
|
1 SIMPLE t1 ALL NULL NULL NULL NULL 5 39.84 Using where
|
||||||
|
Warnings:
|
||||||
|
Note 1003 select `test`.`t1`.`a` AS `a` from `test`.`t1` where `test`.`t1`.`a` = 2
|
||||||
|
SET optimizer_use_condition_selectivity=3;
|
||||||
|
# filtered should show 25 %
|
||||||
|
EXPLAIN EXTENDED SELECT * FROM t1 WHERE a=2;
|
||||||
|
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||||
|
1 SIMPLE t1 ALL NULL NULL NULL NULL 5 25.00 Using where
|
||||||
|
Warnings:
|
||||||
|
Note 1003 select `test`.`t1`.`a` AS `a` from `test`.`t1` where `test`.`t1`.`a` = 2
|
||||||
|
FLUSH TABLES;
|
||||||
|
EXPLAIN EXTENDED SELECT * FROM t1 WHERE a=2;
|
||||||
|
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||||
|
1 SIMPLE t1 ALL NULL NULL NULL NULL 5 25.00 Using where
|
||||||
|
Warnings:
|
||||||
|
Note 1003 select `test`.`t1`.`a` AS `a` from `test`.`t1` where `test`.`t1`.`a` = 2
|
||||||
|
set optimizer_use_condition_selectivity= @save_optimizer_use_condition_selectivity;
|
||||||
|
set histogram_size=@save_histogram_size;
|
||||||
|
set use_stat_tables= @save_use_stat_tables;
|
||||||
|
DROP TABLE t1;
|
||||||
|
# End of 10.2 tests
|
||||||
set @@global.histogram_size=@save_histogram_size;
|
set @@global.histogram_size=@save_histogram_size;
|
||||||
|
@ -1286,6 +1286,51 @@ drop table t1;
|
|||||||
|
|
||||||
--echo # End of 10.1 tests
|
--echo # End of 10.1 tests
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-22583: Selectivity for BIT columns in filtered column for EXPLAIN is incorrect
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
SET optimizer_use_condition_selectivity=4;
|
||||||
|
SET histogram_size=255;
|
||||||
|
CREATE TABLE t1 (a BIT(32), b INT);
|
||||||
|
INSERT INTO t1 VALUES (80, 80), (81, 81), (82, 82);
|
||||||
|
ANALYZE TABLE t1 PERSISTENT FOR ALL;
|
||||||
|
EXPLAIN EXTENDED SELECT * from t1 where t1.a >= 81;
|
||||||
|
SELECT HEX(a), b from t1 where t1.a >= 81;
|
||||||
|
|
||||||
|
set optimizer_use_condition_selectivity= @save_optimizer_use_condition_selectivity;
|
||||||
|
set histogram_size=@save_histogram_size;
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-19474: Histogram statistics are used even with optimizer_use_condition_selectivity=3
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
CREATE TABLE t1(a int);
|
||||||
|
INSERT INTO t1 values (1),(2),(2),(3),(4);
|
||||||
|
SET optimizer_use_condition_selectivity=4;
|
||||||
|
SET histogram_size= 255;
|
||||||
|
|
||||||
|
set use_stat_tables='preferably';
|
||||||
|
|
||||||
|
ANALYZE TABLE t1 PERSISTENT FOR ALL;
|
||||||
|
|
||||||
|
EXPLAIN EXTENDED SELECT * FROM t1 WHERE a=2;
|
||||||
|
SET optimizer_use_condition_selectivity=3;
|
||||||
|
|
||||||
|
--echo # filtered should show 25 %
|
||||||
|
EXPLAIN EXTENDED SELECT * FROM t1 WHERE a=2;
|
||||||
|
FLUSH TABLES;
|
||||||
|
|
||||||
|
EXPLAIN EXTENDED SELECT * FROM t1 WHERE a=2;
|
||||||
|
set optimizer_use_condition_selectivity= @save_optimizer_use_condition_selectivity;
|
||||||
|
set histogram_size=@save_histogram_size;
|
||||||
|
set use_stat_tables= @save_use_stat_tables;
|
||||||
|
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
--echo # End of 10.2 tests
|
||||||
|
|
||||||
#
|
#
|
||||||
# Clean up
|
# Clean up
|
||||||
#
|
#
|
||||||
|
@ -1897,6 +1897,64 @@ a b
|
|||||||
set optimizer_use_condition_selectivity= @save_optimizer_use_condition_selectivity;
|
set optimizer_use_condition_selectivity= @save_optimizer_use_condition_selectivity;
|
||||||
drop table t1;
|
drop table t1;
|
||||||
# End of 10.1 tests
|
# End of 10.1 tests
|
||||||
|
#
|
||||||
|
# MDEV-22583: Selectivity for BIT columns in filtered column for EXPLAIN is incorrect
|
||||||
|
#
|
||||||
|
SET optimizer_use_condition_selectivity=4;
|
||||||
|
SET histogram_size=255;
|
||||||
|
CREATE TABLE t1 (a BIT(32), b INT);
|
||||||
|
INSERT INTO t1 VALUES (80, 80), (81, 81), (82, 82);
|
||||||
|
ANALYZE TABLE t1 PERSISTENT FOR ALL;
|
||||||
|
Table Op Msg_type Msg_text
|
||||||
|
test.t1 analyze status Engine-independent statistics collected
|
||||||
|
test.t1 analyze status OK
|
||||||
|
EXPLAIN EXTENDED SELECT * from t1 where t1.a >= 81;
|
||||||
|
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||||
|
1 SIMPLE t1 ALL NULL NULL NULL NULL 3 66.41 Using where
|
||||||
|
Warnings:
|
||||||
|
Note 1003 select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b` from `test`.`t1` where `test`.`t1`.`a` >= 81
|
||||||
|
SELECT HEX(a), b from t1 where t1.a >= 81;
|
||||||
|
HEX(a) b
|
||||||
|
51 81
|
||||||
|
52 82
|
||||||
|
set optimizer_use_condition_selectivity= @save_optimizer_use_condition_selectivity;
|
||||||
|
set histogram_size=@save_histogram_size;
|
||||||
|
DROP TABLE t1;
|
||||||
|
#
|
||||||
|
# MDEV-19474: Histogram statistics are used even with optimizer_use_condition_selectivity=3
|
||||||
|
#
|
||||||
|
CREATE TABLE t1(a int);
|
||||||
|
INSERT INTO t1 values (1),(2),(2),(3),(4);
|
||||||
|
SET optimizer_use_condition_selectivity=4;
|
||||||
|
SET histogram_size= 255;
|
||||||
|
set use_stat_tables='preferably';
|
||||||
|
ANALYZE TABLE t1 PERSISTENT FOR ALL;
|
||||||
|
Table Op Msg_type Msg_text
|
||||||
|
test.t1 analyze status Engine-independent statistics collected
|
||||||
|
test.t1 analyze status OK
|
||||||
|
EXPLAIN EXTENDED SELECT * FROM t1 WHERE a=2;
|
||||||
|
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||||
|
1 SIMPLE t1 ALL NULL NULL NULL NULL 5 39.84 Using where
|
||||||
|
Warnings:
|
||||||
|
Note 1003 select `test`.`t1`.`a` AS `a` from `test`.`t1` where `test`.`t1`.`a` = 2
|
||||||
|
SET optimizer_use_condition_selectivity=3;
|
||||||
|
# filtered should show 25 %
|
||||||
|
EXPLAIN EXTENDED SELECT * FROM t1 WHERE a=2;
|
||||||
|
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||||
|
1 SIMPLE t1 ALL NULL NULL NULL NULL 5 25.00 Using where
|
||||||
|
Warnings:
|
||||||
|
Note 1003 select `test`.`t1`.`a` AS `a` from `test`.`t1` where `test`.`t1`.`a` = 2
|
||||||
|
FLUSH TABLES;
|
||||||
|
EXPLAIN EXTENDED SELECT * FROM t1 WHERE a=2;
|
||||||
|
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||||
|
1 SIMPLE t1 ALL NULL NULL NULL NULL 5 25.00 Using where
|
||||||
|
Warnings:
|
||||||
|
Note 1003 select `test`.`t1`.`a` AS `a` from `test`.`t1` where `test`.`t1`.`a` = 2
|
||||||
|
set optimizer_use_condition_selectivity= @save_optimizer_use_condition_selectivity;
|
||||||
|
set histogram_size=@save_histogram_size;
|
||||||
|
set use_stat_tables= @save_use_stat_tables;
|
||||||
|
DROP TABLE t1;
|
||||||
|
# End of 10.2 tests
|
||||||
set @@global.histogram_size=@save_histogram_size;
|
set @@global.histogram_size=@save_histogram_size;
|
||||||
set optimizer_switch=@save_optimizer_switch_for_selectivity_test;
|
set optimizer_switch=@save_optimizer_switch_for_selectivity_test;
|
||||||
set @tmp_ust= @@use_stat_tables;
|
set @tmp_ust= @@use_stat_tables;
|
||||||
|
@ -2687,6 +2687,15 @@ f
|
|||||||
bar
|
bar
|
||||||
DROP TABLE t1, t2;
|
DROP TABLE t1, t2;
|
||||||
#
|
#
|
||||||
|
# MDEV-23449: alias do not exist and a query do not report an error
|
||||||
|
#
|
||||||
|
CREATE TABLE t1(a INT, b INT);
|
||||||
|
INSERT INTO t1 VALUES (1,1), (2,2), (3,3), (4,4), (5,5);
|
||||||
|
SELECT a, b FROM t1 WHERE a IN (SELECT A.a FROM t1 A GROUP BY s.id);
|
||||||
|
ERROR 42S22: Unknown column 's.id' in 'group statement'
|
||||||
|
DROP TABLE t1;
|
||||||
|
# End of 10.2 tests
|
||||||
|
#
|
||||||
# MDEV-18335: Assertion `!error || error == 137' failed in subselect_rowid_merge_engine::init
|
# MDEV-18335: Assertion `!error || error == 137' failed in subselect_rowid_merge_engine::init
|
||||||
#
|
#
|
||||||
CREATE TABLE t1 (i1 int,v1 varchar(1),KEY (v1,i1));
|
CREATE TABLE t1 (i1 int,v1 varchar(1),KEY (v1,i1));
|
||||||
@ -2717,7 +2726,6 @@ Warnings:
|
|||||||
Warning 1931 Query execution was interrupted. The query examined at least 3020 rows, which exceeds LIMIT ROWS EXAMINED (500). The query result may be incomplete
|
Warning 1931 Query execution was interrupted. The query examined at least 3020 rows, which exceeds LIMIT ROWS EXAMINED (500). The query result may be incomplete
|
||||||
SET join_cache_level= @save_join_cache_level;
|
SET join_cache_level= @save_join_cache_level;
|
||||||
DROP TABLE t1,t2,t3,t4;
|
DROP TABLE t1,t2,t3,t4;
|
||||||
# End of 10.2 tests
|
|
||||||
#
|
#
|
||||||
# MDEV-21265: IN predicate conversion to IN subquery should be allowed for a broader set of datatype comparison
|
# MDEV-21265: IN predicate conversion to IN subquery should be allowed for a broader set of datatype comparison
|
||||||
#
|
#
|
||||||
|
@ -2201,6 +2201,19 @@ SELECT * FROM t2;
|
|||||||
|
|
||||||
DROP TABLE t1, t2;
|
DROP TABLE t1, t2;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-23449: alias do not exist and a query do not report an error
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
CREATE TABLE t1(a INT, b INT);
|
||||||
|
INSERT INTO t1 VALUES (1,1), (2,2), (3,3), (4,4), (5,5);
|
||||||
|
|
||||||
|
--error ER_BAD_FIELD_ERROR
|
||||||
|
SELECT a, b FROM t1 WHERE a IN (SELECT A.a FROM t1 A GROUP BY s.id);
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
--echo # End of 10.2 tests
|
||||||
|
|
||||||
--echo #
|
--echo #
|
||||||
--echo # MDEV-18335: Assertion `!error || error == 137' failed in subselect_rowid_merge_engine::init
|
--echo # MDEV-18335: Assertion `!error || error == 137' failed in subselect_rowid_merge_engine::init
|
||||||
--echo #
|
--echo #
|
||||||
@ -2236,9 +2249,6 @@ from t2 join t1 on
|
|||||||
SET join_cache_level= @save_join_cache_level;
|
SET join_cache_level= @save_join_cache_level;
|
||||||
|
|
||||||
DROP TABLE t1,t2,t3,t4;
|
DROP TABLE t1,t2,t3,t4;
|
||||||
|
|
||||||
--echo # End of 10.2 tests
|
|
||||||
|
|
||||||
--echo #
|
--echo #
|
||||||
--echo # MDEV-21265: IN predicate conversion to IN subquery should be allowed for a broader set of datatype comparison
|
--echo # MDEV-21265: IN predicate conversion to IN subquery should be allowed for a broader set of datatype comparison
|
||||||
--echo #
|
--echo #
|
||||||
|
@ -176,9 +176,8 @@ Note 1265 Data truncated for column 'a' at row 2
|
|||||||
insert ignore into t1 values ("1e+18446744073709551615"),("1e+18446744073709551616"),("1e-9223372036854775807"),("1e-9223372036854775809");
|
insert ignore into t1 values ("1e+18446744073709551615"),("1e+18446744073709551616"),("1e-9223372036854775807"),("1e-9223372036854775809");
|
||||||
Warnings:
|
Warnings:
|
||||||
Warning 1264 Out of range value for column 'a' at row 1
|
Warning 1264 Out of range value for column 'a' at row 1
|
||||||
Warning 1366 Incorrect decimal value: '1e+18446744073709551616' for column `test`.`t1`.`a` at row 2
|
Warning 1264 Out of range value for column 'a' at row 2
|
||||||
Note 1265 Data truncated for column 'a' at row 3
|
Note 1265 Data truncated for column 'a' at row 3
|
||||||
Warning 1366 Incorrect decimal value: '1e-9223372036854775809' for column `test`.`t1`.`a` at row 4
|
|
||||||
insert ignore into t1 values ("123.4e"),("123.4e+2"),("123.4e-2"),("123e1"),("123e+0");
|
insert ignore into t1 values ("123.4e"),("123.4e+2"),("123.4e-2"),("123e1"),("123e+0");
|
||||||
Warnings:
|
Warnings:
|
||||||
Warning 1265 Data truncated for column 'a' at row 1
|
Warning 1265 Data truncated for column 'a' at row 1
|
||||||
@ -209,7 +208,7 @@ a
|
|||||||
99999999.99
|
99999999.99
|
||||||
0.00
|
0.00
|
||||||
99999999.99
|
99999999.99
|
||||||
0.00
|
99999999.99
|
||||||
0.00
|
0.00
|
||||||
0.00
|
0.00
|
||||||
123.40
|
123.40
|
||||||
@ -1078,6 +1077,90 @@ t1 CREATE TABLE `t1` (
|
|||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
DROP TABLE t1dec102;
|
DROP TABLE t1dec102;
|
||||||
#
|
#
|
||||||
|
# MDEV-24790 CAST('0e1111111111' AS DECIMAL(38,0)) returns a wrong result
|
||||||
|
#
|
||||||
|
SELECT CAST('0e111111111' AS DECIMAL(38,0)) AS a;
|
||||||
|
a
|
||||||
|
0
|
||||||
|
SELECT CAST('0e1111111111' AS DECIMAL(38,0)) AS a;
|
||||||
|
a
|
||||||
|
0
|
||||||
|
SELECT CAST('.00000000000000000000000000000000000001e111111111111111111111' AS DECIMAL(38,0)) AS a;
|
||||||
|
a
|
||||||
|
99999999999999999999999999999999999999
|
||||||
|
Warnings:
|
||||||
|
Warning 1916 Got overflow when converting '' to DECIMAL. Value truncated
|
||||||
|
Warning 1292 Truncated incorrect DECIMAL value: '.00000000000000000000000000000000000001e111111111111111111111'
|
||||||
|
Warning 1264 Out of range value for column 'a' at row 1
|
||||||
|
CREATE TABLE t1 (str VARCHAR(128), comment VARCHAR(128));
|
||||||
|
INSERT INTO t1 VALUES
|
||||||
|
('0e111111111111111111111', 'Zero mantissa and a huge positive exponent'),
|
||||||
|
('1e111111111111111111111', 'Non-zero mantissa, huge positive exponent'),
|
||||||
|
('0e-111111111111111111111', 'Zero mantissa and a huge negative exponent'),
|
||||||
|
('1e-111111111111111111111', 'Non-zero mantissa and a huge negative exponent');
|
||||||
|
BEGIN NOT ATOMIC
|
||||||
|
DECLARE done INT DEFAULT FALSE;
|
||||||
|
DECLARE vstr, vcomment VARCHAR(128);
|
||||||
|
DECLARE cur1 CURSOR FOR SELECT str, comment FROM t1 ORDER BY str;
|
||||||
|
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
|
||||||
|
OPEN cur1;
|
||||||
|
read_loop:
|
||||||
|
LOOP
|
||||||
|
FETCH cur1 INTO vstr, vcomment;
|
||||||
|
IF done THEN
|
||||||
|
LEAVE read_loop;
|
||||||
|
END IF;
|
||||||
|
SELECT vstr AS `--------`, vcomment AS `--------`;
|
||||||
|
SELECT CAST(str AS DECIMAL(38,0)) FROM t1 WHERE str=vstr;
|
||||||
|
SHOW WARNINGS;
|
||||||
|
SELECT CAST(CONCAT(str,'garbage') AS DECIMAL(38,0)) FROM t1 WHERE str=vstr;
|
||||||
|
SHOW WARNINGS;
|
||||||
|
END LOOP;
|
||||||
|
END;
|
||||||
|
$$
|
||||||
|
-------- --------
|
||||||
|
0e-111111111111111111111 Zero mantissa and a huge negative exponent
|
||||||
|
CAST(str AS DECIMAL(38,0))
|
||||||
|
0
|
||||||
|
Level Code Message
|
||||||
|
CAST(CONCAT(str,'garbage') AS DECIMAL(38,0))
|
||||||
|
0
|
||||||
|
Level Code Message
|
||||||
|
Warning 1292 Truncated incorrect DECIMAL value: '0e-111111111111111111111garbage'
|
||||||
|
-------- --------
|
||||||
|
0e111111111111111111111 Zero mantissa and a huge positive exponent
|
||||||
|
CAST(str AS DECIMAL(38,0))
|
||||||
|
0
|
||||||
|
Level Code Message
|
||||||
|
CAST(CONCAT(str,'garbage') AS DECIMAL(38,0))
|
||||||
|
0
|
||||||
|
Level Code Message
|
||||||
|
Warning 1292 Truncated incorrect DECIMAL value: '0e111111111111111111111garbage'
|
||||||
|
-------- --------
|
||||||
|
1e-111111111111111111111 Non-zero mantissa and a huge negative exponent
|
||||||
|
CAST(str AS DECIMAL(38,0))
|
||||||
|
0
|
||||||
|
Level Code Message
|
||||||
|
CAST(CONCAT(str,'garbage') AS DECIMAL(38,0))
|
||||||
|
0
|
||||||
|
Level Code Message
|
||||||
|
Warning 1292 Truncated incorrect DECIMAL value: '1e-111111111111111111111garbage'
|
||||||
|
-------- --------
|
||||||
|
1e111111111111111111111 Non-zero mantissa, huge positive exponent
|
||||||
|
CAST(str AS DECIMAL(38,0))
|
||||||
|
99999999999999999999999999999999999999
|
||||||
|
Level Code Message
|
||||||
|
Warning 1916 Got overflow when converting '' to DECIMAL. Value truncated
|
||||||
|
Warning 1292 Truncated incorrect DECIMAL value: '1e111111111111111111111'
|
||||||
|
Warning 1264 Out of range value for column 'CAST(str AS DECIMAL(38,0))' at row 1
|
||||||
|
CAST(CONCAT(str,'garbage') AS DECIMAL(38,0))
|
||||||
|
99999999999999999999999999999999999999
|
||||||
|
Level Code Message
|
||||||
|
Warning 1916 Got overflow when converting '' to DECIMAL. Value truncated
|
||||||
|
Warning 1292 Truncated incorrect DECIMAL value: '1e111111111111111111111garbage'
|
||||||
|
Warning 1264 Out of range value for column 'CAST(CONCAT(str,'garbage') AS DECIMAL(38,0))' at row 1
|
||||||
|
DROP TABLE t1;
|
||||||
|
#
|
||||||
# End of 10.2 tests
|
# End of 10.2 tests
|
||||||
#
|
#
|
||||||
#
|
#
|
||||||
|
@ -669,6 +669,50 @@ DROP TABLE t1;
|
|||||||
|
|
||||||
DROP TABLE t1dec102;
|
DROP TABLE t1dec102;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-24790 CAST('0e1111111111' AS DECIMAL(38,0)) returns a wrong result
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
SELECT CAST('0e111111111' AS DECIMAL(38,0)) AS a;
|
||||||
|
SELECT CAST('0e1111111111' AS DECIMAL(38,0)) AS a;
|
||||||
|
SELECT CAST('.00000000000000000000000000000000000001e111111111111111111111' AS DECIMAL(38,0)) AS a;
|
||||||
|
|
||||||
|
CREATE TABLE t1 (str VARCHAR(128), comment VARCHAR(128));
|
||||||
|
INSERT INTO t1 VALUES
|
||||||
|
('0e111111111111111111111', 'Zero mantissa and a huge positive exponent'),
|
||||||
|
('1e111111111111111111111', 'Non-zero mantissa, huge positive exponent'),
|
||||||
|
('0e-111111111111111111111', 'Zero mantissa and a huge negative exponent'),
|
||||||
|
('1e-111111111111111111111', 'Non-zero mantissa and a huge negative exponent');
|
||||||
|
|
||||||
|
# The loop below issues SHOW WARNINGS manually, disable automatic warnings
|
||||||
|
--disable_warnings
|
||||||
|
DELIMITER $$;
|
||||||
|
BEGIN NOT ATOMIC
|
||||||
|
DECLARE done INT DEFAULT FALSE;
|
||||||
|
DECLARE vstr, vcomment VARCHAR(128);
|
||||||
|
DECLARE cur1 CURSOR FOR SELECT str, comment FROM t1 ORDER BY str;
|
||||||
|
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
|
||||||
|
OPEN cur1;
|
||||||
|
read_loop:
|
||||||
|
LOOP
|
||||||
|
FETCH cur1 INTO vstr, vcomment;
|
||||||
|
IF done THEN
|
||||||
|
LEAVE read_loop;
|
||||||
|
END IF;
|
||||||
|
SELECT vstr AS `--------`, vcomment AS `--------`;
|
||||||
|
SELECT CAST(str AS DECIMAL(38,0)) FROM t1 WHERE str=vstr;
|
||||||
|
SHOW WARNINGS;
|
||||||
|
SELECT CAST(CONCAT(str,'garbage') AS DECIMAL(38,0)) FROM t1 WHERE str=vstr;
|
||||||
|
SHOW WARNINGS;
|
||||||
|
END LOOP;
|
||||||
|
END;
|
||||||
|
$$
|
||||||
|
DELIMITER ;$$
|
||||||
|
--enable_warnings
|
||||||
|
|
||||||
|
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
--echo #
|
--echo #
|
||||||
--echo # End of 10.2 tests
|
--echo # End of 10.2 tests
|
||||||
--echo #
|
--echo #
|
||||||
|
@ -6762,6 +6762,21 @@ DROP PROCEDURE sp1;
|
|||||||
DROP VIEW v1;
|
DROP VIEW v1;
|
||||||
DROP TABLE t1, t2;
|
DROP TABLE t1, t2;
|
||||||
#
|
#
|
||||||
|
# MDEV-23291: SUM column from a derived table returns invalid values
|
||||||
|
#
|
||||||
|
CREATE TABLE t1(a INT, b INT);
|
||||||
|
INSERT INTO t1 VALUES (1,1), (2,2);
|
||||||
|
CREATE view v1 AS
|
||||||
|
SELECT a as x, (select x) as y, (select y) as z FROM t1;
|
||||||
|
SELECT sum(z) FROM (SELECT a as x, (select x) as y, (select y) as z FROM t1) q;
|
||||||
|
sum(z)
|
||||||
|
3
|
||||||
|
SELECT sum(z) FROM v1;
|
||||||
|
sum(z)
|
||||||
|
3
|
||||||
|
DROP TABLE t1;
|
||||||
|
DROP VIEW v1;
|
||||||
|
#
|
||||||
# End of 10.2 tests
|
# End of 10.2 tests
|
||||||
#
|
#
|
||||||
#
|
#
|
||||||
|
@ -6483,6 +6483,22 @@ DROP PROCEDURE sp1;
|
|||||||
DROP VIEW v1;
|
DROP VIEW v1;
|
||||||
DROP TABLE t1, t2;
|
DROP TABLE t1, t2;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-23291: SUM column from a derived table returns invalid values
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
CREATE TABLE t1(a INT, b INT);
|
||||||
|
INSERT INTO t1 VALUES (1,1), (2,2);
|
||||||
|
|
||||||
|
CREATE view v1 AS
|
||||||
|
SELECT a as x, (select x) as y, (select y) as z FROM t1;
|
||||||
|
|
||||||
|
SELECT sum(z) FROM (SELECT a as x, (select x) as y, (select y) as z FROM t1) q;
|
||||||
|
SELECT sum(z) FROM v1;
|
||||||
|
|
||||||
|
DROP TABLE t1;
|
||||||
|
DROP VIEW v1;
|
||||||
|
|
||||||
--echo #
|
--echo #
|
||||||
--echo # End of 10.2 tests
|
--echo # End of 10.2 tests
|
||||||
--echo #
|
--echo #
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -1,280 +0,0 @@
|
|||||||
#
|
|
||||||
# This include file is used by more than one test suite
|
|
||||||
# (currently binlog and binlog_encryption).
|
|
||||||
# Please check all dependent tests after modifying it
|
|
||||||
#
|
|
||||||
|
|
||||||
--source include/have_innodb.inc
|
|
||||||
--source include/have_debug.inc
|
|
||||||
--source include/have_debug_sync.inc
|
|
||||||
--source include/have_binlog_format_row.inc
|
|
||||||
# Valgrind does not work well with test that crashes the server
|
|
||||||
--source include/not_valgrind.inc
|
|
||||||
|
|
||||||
# (We do not need to restore these settings, as we crash the server).
|
|
||||||
SET GLOBAL max_binlog_size= 4096;
|
|
||||||
SET GLOBAL innodb_flush_log_at_trx_commit= 1;
|
|
||||||
RESET MASTER;
|
|
||||||
|
|
||||||
CREATE TABLE t1 (a INT PRIMARY KEY, b MEDIUMTEXT) ENGINE=Innodb;
|
|
||||||
# Insert some data to force a couple binlog rotations (3), so we get some
|
|
||||||
# normal binlog checkpoints before starting the test.
|
|
||||||
INSERT INTO t1 VALUES (100, REPEAT("x", 4100));
|
|
||||||
# Wait for the master-bin.000002 binlog checkpoint to appear.
|
|
||||||
--let $wait_for_all= 0
|
|
||||||
--let $show_statement= SHOW BINLOG EVENTS IN "master-bin.000002"
|
|
||||||
--let $field= Info
|
|
||||||
--let $condition= = "master-bin.000002"
|
|
||||||
--source include/wait_show_condition.inc
|
|
||||||
INSERT INTO t1 VALUES (101, REPEAT("x", 4100));
|
|
||||||
--let $wait_for_all= 0
|
|
||||||
--let $show_statement= SHOW BINLOG EVENTS IN "master-bin.000003"
|
|
||||||
--let $field= Info
|
|
||||||
--let $condition= = "master-bin.000003"
|
|
||||||
--source include/wait_show_condition.inc
|
|
||||||
INSERT INTO t1 VALUES (102, REPEAT("x", 4100));
|
|
||||||
--let $wait_for_all= 0
|
|
||||||
--let $show_statement= SHOW BINLOG EVENTS IN "master-bin.000004"
|
|
||||||
--let $field= Info
|
|
||||||
--let $condition= = "master-bin.000004"
|
|
||||||
--source include/wait_show_condition.inc
|
|
||||||
|
|
||||||
# Now start a bunch of transactions that span multiple binlog
|
|
||||||
# files. Leave then in the state prepared-but-not-committed in the engine
|
|
||||||
# and crash the server. Check that crash recovery is able to recover all
|
|
||||||
# of them.
|
|
||||||
#
|
|
||||||
# We use debug_sync to get all the transactions into the prepared state before
|
|
||||||
# we commit any of them. This is because the prepare step flushes the InnoDB
|
|
||||||
# redo log - including any commits made before, so recovery would become
|
|
||||||
# unnecessary, decreasing the value of this test.
|
|
||||||
#
|
|
||||||
# We arrange to have con1 with a prepared transaction in master-bin.000004,
|
|
||||||
# con2 and con3 with a prepared transaction in master-bin.000005, and a new
|
|
||||||
# empty master-bin.000006. So the latest binlog checkpoint should be
|
|
||||||
# master-bin.000006.
|
|
||||||
|
|
||||||
connect(con1,localhost,root,,);
|
|
||||||
# First wait after prepare and before write to binlog.
|
|
||||||
SET DEBUG_SYNC= "ha_commit_trans_before_log_and_order SIGNAL con1_wait WAIT_FOR con1_cont";
|
|
||||||
# Then complete InnoDB commit in memory (but not commit checkpoint / write to
|
|
||||||
# disk), and hang until crash, leaving a transaction to be XA recovered.
|
|
||||||
SET DEBUG_SYNC= "commit_after_group_release_commit_ordered SIGNAL con1_ready WAIT_FOR _ever";
|
|
||||||
send INSERT INTO t1 VALUES (1, REPEAT("x", 4100));
|
|
||||||
|
|
||||||
connection default;
|
|
||||||
SET DEBUG_SYNC= "now WAIT_FOR con1_wait";
|
|
||||||
|
|
||||||
connect(con2,localhost,root,,);
|
|
||||||
SET DEBUG_SYNC= "ha_commit_trans_before_log_and_order SIGNAL con2_wait WAIT_FOR con2_cont";
|
|
||||||
SET DEBUG_SYNC= "commit_after_group_release_commit_ordered SIGNAL con2_ready WAIT_FOR _ever";
|
|
||||||
send INSERT INTO t1 VALUES (2, NULL);
|
|
||||||
|
|
||||||
connection default;
|
|
||||||
SET DEBUG_SYNC= "now WAIT_FOR con2_wait";
|
|
||||||
|
|
||||||
connect(con3,localhost,root,,);
|
|
||||||
SET DEBUG_SYNC= "ha_commit_trans_before_log_and_order SIGNAL con3_wait WAIT_FOR con3_cont";
|
|
||||||
SET DEBUG_SYNC= "commit_after_group_release_commit_ordered SIGNAL con3_ready WAIT_FOR _ever";
|
|
||||||
send INSERT INTO t1 VALUES (3, REPEAT("x", 4100));
|
|
||||||
|
|
||||||
connection default;
|
|
||||||
SET DEBUG_SYNC= "now WAIT_FOR con3_wait";
|
|
||||||
|
|
||||||
connect(con4,localhost,root,,);
|
|
||||||
SET DEBUG_SYNC= "ha_commit_trans_before_log_and_order SIGNAL con4_wait WAIT_FOR con4_cont";
|
|
||||||
SET SESSION debug_dbug="+d,crash_commit_after_log";
|
|
||||||
send INSERT INTO t1 VALUES (4, NULL);
|
|
||||||
|
|
||||||
connection default;
|
|
||||||
SET DEBUG_SYNC= "now WAIT_FOR con4_wait";
|
|
||||||
|
|
||||||
SET DEBUG_SYNC= "now SIGNAL con1_cont";
|
|
||||||
SET DEBUG_SYNC= "now WAIT_FOR con1_ready";
|
|
||||||
SET DEBUG_SYNC= "now SIGNAL con2_cont";
|
|
||||||
SET DEBUG_SYNC= "now WAIT_FOR con2_ready";
|
|
||||||
SET DEBUG_SYNC= "now SIGNAL con3_cont";
|
|
||||||
SET DEBUG_SYNC= "now WAIT_FOR con3_ready";
|
|
||||||
|
|
||||||
# Check that everything is committed in binary log.
|
|
||||||
--source include/show_binary_logs.inc
|
|
||||||
--let $binlog_file= master-bin.000003
|
|
||||||
--let $binlog_start= 4
|
|
||||||
--source include/show_binlog_events.inc
|
|
||||||
--let $binlog_file= master-bin.000004
|
|
||||||
--source include/show_binlog_events.inc
|
|
||||||
--let $binlog_file= master-bin.000005
|
|
||||||
--source include/show_binlog_events.inc
|
|
||||||
--let $binlog_file= master-bin.000006
|
|
||||||
--source include/show_binlog_events.inc
|
|
||||||
|
|
||||||
|
|
||||||
# Check that server will not purge too much.
|
|
||||||
PURGE BINARY LOGS TO "master-bin.000006";
|
|
||||||
--source include/show_binary_logs.inc
|
|
||||||
|
|
||||||
# Now crash the server with one more transaction in prepared state.
|
|
||||||
--write_file $MYSQLTEST_VARDIR/tmp/mysqld.1.expect
|
|
||||||
wait-binlog_xa_recover.test
|
|
||||||
EOF
|
|
||||||
--error 0,2006,2013
|
|
||||||
SET DEBUG_SYNC= "now SIGNAL con4_cont";
|
|
||||||
connection con4;
|
|
||||||
--error 2006,2013
|
|
||||||
reap;
|
|
||||||
|
|
||||||
--append_file $MYSQLTEST_VARDIR/tmp/mysqld.1.expect
|
|
||||||
restart-group_commit_binlog_pos.test
|
|
||||||
EOF
|
|
||||||
|
|
||||||
connection default;
|
|
||||||
--enable_reconnect
|
|
||||||
--source include/wait_until_connected_again.inc
|
|
||||||
|
|
||||||
# Check that all transactions are recovered.
|
|
||||||
SELECT a FROM t1 ORDER BY a;
|
|
||||||
|
|
||||||
--echo Test that with multiple binlog checkpoints, recovery starts from the last one.
|
|
||||||
SET GLOBAL max_binlog_size= 4096;
|
|
||||||
SET GLOBAL innodb_flush_log_at_trx_commit= 1;
|
|
||||||
RESET MASTER;
|
|
||||||
|
|
||||||
# Rotate to binlog master-bin.000003 while delaying binlog checkpoints.
|
|
||||||
# So we get multiple binlog checkpoints in master-bin.000003.
|
|
||||||
# Then complete the checkpoints, crash, and check that we only scan
|
|
||||||
# the necessary binlog file (ie. that we use the _last_ checkpoint).
|
|
||||||
|
|
||||||
connect(con10,localhost,root,,);
|
|
||||||
SET DEBUG_SYNC= "commit_after_group_release_commit_ordered SIGNAL con10_ready WAIT_FOR con10_cont";
|
|
||||||
send INSERT INTO t1 VALUES (10, REPEAT("x", 4100));
|
|
||||||
|
|
||||||
connection default;
|
|
||||||
SET DEBUG_SYNC= "now WAIT_FOR con10_ready";
|
|
||||||
|
|
||||||
connect(con11,localhost,root,,);
|
|
||||||
SET DEBUG_SYNC= "commit_after_group_release_commit_ordered SIGNAL con11_ready WAIT_FOR con11_cont";
|
|
||||||
send INSERT INTO t1 VALUES (11, REPEAT("x", 4100));
|
|
||||||
|
|
||||||
connection default;
|
|
||||||
SET DEBUG_SYNC= "now WAIT_FOR con11_ready";
|
|
||||||
|
|
||||||
connect(con12,localhost,root,,);
|
|
||||||
SET DEBUG_SYNC= "commit_after_group_release_commit_ordered SIGNAL con12_ready WAIT_FOR con12_cont";
|
|
||||||
send INSERT INTO t1 VALUES (12, REPEAT("x", 4100));
|
|
||||||
|
|
||||||
connection default;
|
|
||||||
SET DEBUG_SYNC= "now WAIT_FOR con12_ready";
|
|
||||||
INSERT INTO t1 VALUES (13, NULL);
|
|
||||||
|
|
||||||
--source include/show_binary_logs.inc
|
|
||||||
--let $binlog_file= master-bin.000004
|
|
||||||
--let $binlog_start= 4
|
|
||||||
--source include/show_binlog_events.inc
|
|
||||||
|
|
||||||
SET DEBUG_SYNC= "now SIGNAL con10_cont";
|
|
||||||
connection con10;
|
|
||||||
reap;
|
|
||||||
connection default;
|
|
||||||
|
|
||||||
# We need to sync the test case with the background processing of the
|
|
||||||
# commit checkpoint, otherwise we get nondeterministic results.
|
|
||||||
SET @old_dbug= @@global.DEBUG_DBUG;
|
|
||||||
SET GLOBAL debug_dbug="+d,binlog_background_checkpoint_processed";
|
|
||||||
SET DEBUG_SYNC= "now WAIT_FOR binlog_background_checkpoint_processed";
|
|
||||||
SET DEBUG_SYNC= "now SIGNAL con12_cont";
|
|
||||||
connection con12;
|
|
||||||
reap;
|
|
||||||
connection default;
|
|
||||||
SET GLOBAL debug_dbug= @old_dbug;
|
|
||||||
|
|
||||||
SET DEBUG_SYNC= "now SIGNAL con11_cont";
|
|
||||||
connection con11;
|
|
||||||
reap;
|
|
||||||
|
|
||||||
connection default;
|
|
||||||
# Wait for the last (master-bin.000004) binlog checkpoint to appear.
|
|
||||||
--let $wait_for_all= 0
|
|
||||||
--let $show_statement= SHOW BINLOG EVENTS IN "master-bin.000004"
|
|
||||||
--let $field= Info
|
|
||||||
--let $condition= = "master-bin.000004"
|
|
||||||
--source include/wait_show_condition.inc
|
|
||||||
|
|
||||||
--echo Checking that master-bin.000004 is the last binlog checkpoint
|
|
||||||
--source include/show_binlog_events.inc
|
|
||||||
|
|
||||||
--echo Now crash the server
|
|
||||||
# It is not too easy to test XA recovery, as it runs early during server
|
|
||||||
# startup, before any connections can be made.
|
|
||||||
# What we do is set a DBUG error insert which will crash if XA recovery
|
|
||||||
# starts from any other binlog than master-bin.000004 (check the file
|
|
||||||
# binlog_xa_recover-master.opt). Then we will fail here if XA recovery
|
|
||||||
# would start from the wrong place.
|
|
||||||
--write_file $MYSQLTEST_VARDIR/tmp/mysqld.1.expect
|
|
||||||
wait-binlog_xa_recover.test
|
|
||||||
EOF
|
|
||||||
SET SESSION debug_dbug="+d,crash_commit_after_log";
|
|
||||||
--error 2006,2013
|
|
||||||
INSERT INTO t1 VALUES (14, NULL);
|
|
||||||
|
|
||||||
--append_file $MYSQLTEST_VARDIR/tmp/mysqld.1.expect
|
|
||||||
restart-group_commit_binlog_pos.test
|
|
||||||
EOF
|
|
||||||
|
|
||||||
connection default;
|
|
||||||
--enable_reconnect
|
|
||||||
--source include/wait_until_connected_again.inc
|
|
||||||
|
|
||||||
# Check that all transactions are recovered.
|
|
||||||
SELECT a FROM t1 ORDER BY a;
|
|
||||||
|
|
||||||
|
|
||||||
--echo *** Check that recovery works if we crashed early during rotate, before
|
|
||||||
--echo *** binlog checkpoint event could be written.
|
|
||||||
|
|
||||||
SET GLOBAL max_binlog_size= 4096;
|
|
||||||
SET GLOBAL innodb_flush_log_at_trx_commit= 1;
|
|
||||||
RESET MASTER;
|
|
||||||
|
|
||||||
# We need some initial data to reach binlog master-bin.000004. Otherwise
|
|
||||||
# crash recovery fails due to the error insert used for previous test.
|
|
||||||
INSERT INTO t1 VALUES (21, REPEAT("x", 4100));
|
|
||||||
INSERT INTO t1 VALUES (22, REPEAT("x", 4100));
|
|
||||||
# Wait for the master-bin.000003 binlog checkpoint to appear.
|
|
||||||
--let $wait_for_all= 0
|
|
||||||
--let $show_statement= SHOW BINLOG EVENTS IN "master-bin.000003"
|
|
||||||
--let $field= Info
|
|
||||||
--let $condition= = "master-bin.000003"
|
|
||||||
--source include/wait_show_condition.inc
|
|
||||||
INSERT INTO t1 VALUES (23, REPEAT("x", 4100));
|
|
||||||
# Wait for the last (master-bin.000004) binlog checkpoint to appear.
|
|
||||||
--let $wait_for_all= 0
|
|
||||||
--let $show_statement= SHOW BINLOG EVENTS IN "master-bin.000004"
|
|
||||||
--let $field= Info
|
|
||||||
--let $condition= = "master-bin.000004"
|
|
||||||
--source include/wait_show_condition.inc
|
|
||||||
|
|
||||||
--write_file $MYSQLTEST_VARDIR/tmp/mysqld.1.expect
|
|
||||||
wait-binlog_xa_recover.test
|
|
||||||
EOF
|
|
||||||
SET SESSION debug_dbug="+d,crash_before_write_checkpoint_event";
|
|
||||||
--error 2006,2013
|
|
||||||
INSERT INTO t1 VALUES (24, REPEAT("x", 4100));
|
|
||||||
|
|
||||||
--append_file $MYSQLTEST_VARDIR/tmp/mysqld.1.expect
|
|
||||||
restart-group_commit_binlog_pos.test
|
|
||||||
EOF
|
|
||||||
|
|
||||||
--enable_reconnect
|
|
||||||
--source include/wait_until_connected_again.inc
|
|
||||||
|
|
||||||
# Check that all transactions are recovered.
|
|
||||||
SELECT a FROM t1 ORDER BY a;
|
|
||||||
|
|
||||||
--source include/show_binary_logs.inc
|
|
||||||
--let $binlog_file= master-bin.000004
|
|
||||||
--let $binlog_start= 4
|
|
||||||
--source include/show_binlog_events.inc
|
|
||||||
|
|
||||||
# Cleanup
|
|
||||||
connection default;
|
|
||||||
DROP TABLE t1;
|
|
@ -146,29 +146,12 @@ master-bin.000004 # Xid # # COMMIT /* XID */
|
|||||||
SET DEBUG_SYNC= "now SIGNAL con10_cont";
|
SET DEBUG_SYNC= "now SIGNAL con10_cont";
|
||||||
connection con10;
|
connection con10;
|
||||||
connection default;
|
connection default;
|
||||||
SET @old_dbug= @@global.DEBUG_DBUG;
|
|
||||||
SET GLOBAL debug_dbug="+d,binlog_background_checkpoint_processed";
|
|
||||||
SET DEBUG_SYNC= "now WAIT_FOR binlog_background_checkpoint_processed";
|
|
||||||
SET DEBUG_SYNC= "now SIGNAL con12_cont";
|
SET DEBUG_SYNC= "now SIGNAL con12_cont";
|
||||||
connection con12;
|
connection con12;
|
||||||
connection default;
|
connection default;
|
||||||
SET GLOBAL debug_dbug= @old_dbug;
|
|
||||||
SET DEBUG_SYNC= "now SIGNAL con11_cont";
|
SET DEBUG_SYNC= "now SIGNAL con11_cont";
|
||||||
connection con11;
|
connection con11;
|
||||||
connection default;
|
connection default;
|
||||||
Checking that master-bin.000004 is the last binlog checkpoint
|
|
||||||
include/show_binlog_events.inc
|
|
||||||
Log_name Pos Event_type Server_id End_log_pos Info
|
|
||||||
master-bin.000004 # Format_desc # # SERVER_VERSION, BINLOG_VERSION
|
|
||||||
master-bin.000004 # Gtid_list # # [#-#-#]
|
|
||||||
master-bin.000004 # Binlog_checkpoint # # master-bin.000001
|
|
||||||
master-bin.000004 # Gtid # # BEGIN GTID #-#-#
|
|
||||||
master-bin.000004 # Annotate_rows # # INSERT INTO t1 VALUES (13, NULL)
|
|
||||||
master-bin.000004 # Table_map # # table_id: # (test.t1)
|
|
||||||
master-bin.000004 # Write_rows_v1 # # table_id: # flags: STMT_END_F
|
|
||||||
master-bin.000004 # Xid # # COMMIT /* XID */
|
|
||||||
master-bin.000004 # Binlog_checkpoint # # master-bin.000002
|
|
||||||
master-bin.000004 # Binlog_checkpoint # # master-bin.000004
|
|
||||||
Now crash the server
|
Now crash the server
|
||||||
SET SESSION debug_dbug="+d,crash_commit_after_log";
|
SET SESSION debug_dbug="+d,crash_commit_after_log";
|
||||||
INSERT INTO t1 VALUES (14, NULL);
|
INSERT INTO t1 VALUES (14, NULL);
|
||||||
|
@ -1 +1,276 @@
|
|||||||
--source include/binlog_xa_recover.inc
|
#
|
||||||
|
# This include file is used by more than one test suite
|
||||||
|
# (currently binlog and binlog_encryption).
|
||||||
|
# Please check all dependent tests after modifying it
|
||||||
|
#
|
||||||
|
|
||||||
|
--source include/have_innodb.inc
|
||||||
|
--source include/have_debug.inc
|
||||||
|
--source include/have_debug_sync.inc
|
||||||
|
--source include/have_binlog_format_row.inc
|
||||||
|
# Valgrind does not work well with test that crashes the server
|
||||||
|
--source include/not_valgrind.inc
|
||||||
|
|
||||||
|
# (We do not need to restore these settings, as we crash the server).
|
||||||
|
SET GLOBAL max_binlog_size= 4096;
|
||||||
|
SET GLOBAL innodb_flush_log_at_trx_commit= 1;
|
||||||
|
RESET MASTER;
|
||||||
|
|
||||||
|
CREATE TABLE t1 (a INT PRIMARY KEY, b MEDIUMTEXT) ENGINE=Innodb;
|
||||||
|
# Insert some data to force a couple binlog rotations (3), so we get some
|
||||||
|
# normal binlog checkpoints before starting the test.
|
||||||
|
INSERT INTO t1 VALUES (100, REPEAT("x", 4100));
|
||||||
|
# Wait for the master-bin.000002 binlog checkpoint to appear.
|
||||||
|
--let $wait_for_all= 0
|
||||||
|
--let $show_statement= SHOW BINLOG EVENTS IN "master-bin.000002"
|
||||||
|
--let $field= Info
|
||||||
|
--let $condition= = "master-bin.000002"
|
||||||
|
--source include/wait_show_condition.inc
|
||||||
|
INSERT INTO t1 VALUES (101, REPEAT("x", 4100));
|
||||||
|
--let $wait_for_all= 0
|
||||||
|
--let $show_statement= SHOW BINLOG EVENTS IN "master-bin.000003"
|
||||||
|
--let $field= Info
|
||||||
|
--let $condition= = "master-bin.000003"
|
||||||
|
--source include/wait_show_condition.inc
|
||||||
|
INSERT INTO t1 VALUES (102, REPEAT("x", 4100));
|
||||||
|
--let $wait_for_all= 0
|
||||||
|
--let $show_statement= SHOW BINLOG EVENTS IN "master-bin.000004"
|
||||||
|
--let $field= Info
|
||||||
|
--let $condition= = "master-bin.000004"
|
||||||
|
--source include/wait_show_condition.inc
|
||||||
|
|
||||||
|
# Now start a bunch of transactions that span multiple binlog
|
||||||
|
# files. Leave then in the state prepared-but-not-committed in the engine
|
||||||
|
# and crash the server. Check that crash recovery is able to recover all
|
||||||
|
# of them.
|
||||||
|
#
|
||||||
|
# We use debug_sync to get all the transactions into the prepared state before
|
||||||
|
# we commit any of them. This is because the prepare step flushes the InnoDB
|
||||||
|
# redo log - including any commits made before, so recovery would become
|
||||||
|
# unnecessary, decreasing the value of this test.
|
||||||
|
#
|
||||||
|
# We arrange to have con1 with a prepared transaction in master-bin.000004,
|
||||||
|
# con2 and con3 with a prepared transaction in master-bin.000005, and a new
|
||||||
|
# empty master-bin.000006. So the latest binlog checkpoint should be
|
||||||
|
# master-bin.000006.
|
||||||
|
|
||||||
|
connect(con1,localhost,root,,);
|
||||||
|
# First wait after prepare and before write to binlog.
|
||||||
|
SET DEBUG_SYNC= "ha_commit_trans_before_log_and_order SIGNAL con1_wait WAIT_FOR con1_cont";
|
||||||
|
# Then complete InnoDB commit in memory (but not commit checkpoint / write to
|
||||||
|
# disk), and hang until crash, leaving a transaction to be XA recovered.
|
||||||
|
SET DEBUG_SYNC= "commit_after_group_release_commit_ordered SIGNAL con1_ready WAIT_FOR _ever";
|
||||||
|
send INSERT INTO t1 VALUES (1, REPEAT("x", 4100));
|
||||||
|
|
||||||
|
connection default;
|
||||||
|
SET DEBUG_SYNC= "now WAIT_FOR con1_wait";
|
||||||
|
|
||||||
|
connect(con2,localhost,root,,);
|
||||||
|
SET DEBUG_SYNC= "ha_commit_trans_before_log_and_order SIGNAL con2_wait WAIT_FOR con2_cont";
|
||||||
|
SET DEBUG_SYNC= "commit_after_group_release_commit_ordered SIGNAL con2_ready WAIT_FOR _ever";
|
||||||
|
send INSERT INTO t1 VALUES (2, NULL);
|
||||||
|
|
||||||
|
connection default;
|
||||||
|
SET DEBUG_SYNC= "now WAIT_FOR con2_wait";
|
||||||
|
|
||||||
|
connect(con3,localhost,root,,);
|
||||||
|
SET DEBUG_SYNC= "ha_commit_trans_before_log_and_order SIGNAL con3_wait WAIT_FOR con3_cont";
|
||||||
|
SET DEBUG_SYNC= "commit_after_group_release_commit_ordered SIGNAL con3_ready WAIT_FOR _ever";
|
||||||
|
send INSERT INTO t1 VALUES (3, REPEAT("x", 4100));
|
||||||
|
|
||||||
|
connection default;
|
||||||
|
SET DEBUG_SYNC= "now WAIT_FOR con3_wait";
|
||||||
|
|
||||||
|
connect(con4,localhost,root,,);
|
||||||
|
SET DEBUG_SYNC= "ha_commit_trans_before_log_and_order SIGNAL con4_wait WAIT_FOR con4_cont";
|
||||||
|
SET SESSION debug_dbug="+d,crash_commit_after_log";
|
||||||
|
send INSERT INTO t1 VALUES (4, NULL);
|
||||||
|
|
||||||
|
connection default;
|
||||||
|
SET DEBUG_SYNC= "now WAIT_FOR con4_wait";
|
||||||
|
|
||||||
|
SET DEBUG_SYNC= "now SIGNAL con1_cont";
|
||||||
|
SET DEBUG_SYNC= "now WAIT_FOR con1_ready";
|
||||||
|
SET DEBUG_SYNC= "now SIGNAL con2_cont";
|
||||||
|
SET DEBUG_SYNC= "now WAIT_FOR con2_ready";
|
||||||
|
SET DEBUG_SYNC= "now SIGNAL con3_cont";
|
||||||
|
SET DEBUG_SYNC= "now WAIT_FOR con3_ready";
|
||||||
|
|
||||||
|
# Check that everything is committed in binary log.
|
||||||
|
--source include/show_binary_logs.inc
|
||||||
|
--let $binlog_file= master-bin.000003
|
||||||
|
--let $binlog_start= 4
|
||||||
|
--source include/show_binlog_events.inc
|
||||||
|
--let $binlog_file= master-bin.000004
|
||||||
|
--source include/show_binlog_events.inc
|
||||||
|
--let $binlog_file= master-bin.000005
|
||||||
|
--source include/show_binlog_events.inc
|
||||||
|
--let $binlog_file= master-bin.000006
|
||||||
|
--source include/show_binlog_events.inc
|
||||||
|
|
||||||
|
|
||||||
|
# Check that server will not purge too much.
|
||||||
|
PURGE BINARY LOGS TO "master-bin.000006";
|
||||||
|
--source include/show_binary_logs.inc
|
||||||
|
|
||||||
|
# Now crash the server with one more transaction in prepared state.
|
||||||
|
--write_file $MYSQLTEST_VARDIR/tmp/mysqld.1.expect
|
||||||
|
wait-binlog_xa_recover.test
|
||||||
|
EOF
|
||||||
|
--error 0,2006,2013
|
||||||
|
SET DEBUG_SYNC= "now SIGNAL con4_cont";
|
||||||
|
connection con4;
|
||||||
|
--error 2006,2013
|
||||||
|
reap;
|
||||||
|
|
||||||
|
--append_file $MYSQLTEST_VARDIR/tmp/mysqld.1.expect
|
||||||
|
restart-group_commit_binlog_pos.test
|
||||||
|
EOF
|
||||||
|
|
||||||
|
connection default;
|
||||||
|
--enable_reconnect
|
||||||
|
--source include/wait_until_connected_again.inc
|
||||||
|
|
||||||
|
# Check that all transactions are recovered.
|
||||||
|
SELECT a FROM t1 ORDER BY a;
|
||||||
|
|
||||||
|
--echo Test that with multiple binlog checkpoints, recovery starts from the last one.
|
||||||
|
SET GLOBAL max_binlog_size= 4096;
|
||||||
|
SET GLOBAL innodb_flush_log_at_trx_commit= 1;
|
||||||
|
RESET MASTER;
|
||||||
|
|
||||||
|
# Rotate to binlog master-bin.000003 while delaying binlog checkpoints.
|
||||||
|
# So we get multiple binlog checkpoints in master-bin.000003.
|
||||||
|
# Then complete the checkpoints, crash, and check that we only scan
|
||||||
|
# the necessary binlog file (ie. that we use the _last_ checkpoint).
|
||||||
|
|
||||||
|
connect(con10,localhost,root,,);
|
||||||
|
SET DEBUG_SYNC= "commit_after_group_release_commit_ordered SIGNAL con10_ready WAIT_FOR con10_cont";
|
||||||
|
send INSERT INTO t1 VALUES (10, REPEAT("x", 4100));
|
||||||
|
|
||||||
|
connection default;
|
||||||
|
SET DEBUG_SYNC= "now WAIT_FOR con10_ready";
|
||||||
|
|
||||||
|
connect(con11,localhost,root,,);
|
||||||
|
SET DEBUG_SYNC= "commit_after_group_release_commit_ordered SIGNAL con11_ready WAIT_FOR con11_cont";
|
||||||
|
send INSERT INTO t1 VALUES (11, REPEAT("x", 4100));
|
||||||
|
|
||||||
|
connection default;
|
||||||
|
SET DEBUG_SYNC= "now WAIT_FOR con11_ready";
|
||||||
|
|
||||||
|
connect(con12,localhost,root,,);
|
||||||
|
SET DEBUG_SYNC= "commit_after_group_release_commit_ordered SIGNAL con12_ready WAIT_FOR con12_cont";
|
||||||
|
send INSERT INTO t1 VALUES (12, REPEAT("x", 4100));
|
||||||
|
|
||||||
|
connection default;
|
||||||
|
SET DEBUG_SYNC= "now WAIT_FOR con12_ready";
|
||||||
|
INSERT INTO t1 VALUES (13, NULL);
|
||||||
|
|
||||||
|
--source include/show_binary_logs.inc
|
||||||
|
--let $binlog_file= master-bin.000004
|
||||||
|
--let $binlog_start= 4
|
||||||
|
--source include/show_binlog_events.inc
|
||||||
|
|
||||||
|
SET DEBUG_SYNC= "now SIGNAL con10_cont";
|
||||||
|
connection con10;
|
||||||
|
reap;
|
||||||
|
connection default;
|
||||||
|
|
||||||
|
# We need to sync the test case with the background processing of the
|
||||||
|
# commit checkpoint, otherwise we get nondeterministic results.
|
||||||
|
let $wait_condition= select count(*) = 1 from performance_schema.threads where processlist_state = "Waiting for background binlog tasks";
|
||||||
|
--source include/wait_condition.inc
|
||||||
|
|
||||||
|
SET DEBUG_SYNC= "now SIGNAL con12_cont";
|
||||||
|
connection con12;
|
||||||
|
reap;
|
||||||
|
connection default;
|
||||||
|
|
||||||
|
SET DEBUG_SYNC= "now SIGNAL con11_cont";
|
||||||
|
connection con11;
|
||||||
|
reap;
|
||||||
|
|
||||||
|
connection default;
|
||||||
|
# Wait for the last (master-bin.000004) binlog checkpoint to appear.
|
||||||
|
--let $wait_for_all= 0
|
||||||
|
--let $show_statement= SHOW BINLOG EVENTS IN "master-bin.000004"
|
||||||
|
--let $field= Info
|
||||||
|
--let $condition= = "master-bin.000004"
|
||||||
|
--source include/wait_show_condition.inc
|
||||||
|
|
||||||
|
--echo Now crash the server
|
||||||
|
# It is not too easy to test XA recovery, as it runs early during server
|
||||||
|
# startup, before any connections can be made.
|
||||||
|
# What we do is set a DBUG error insert which will crash if XA recovery
|
||||||
|
# starts from any other binlog than master-bin.000004 (check the file
|
||||||
|
# binlog_xa_recover-master.opt). Then we will fail here if XA recovery
|
||||||
|
# would start from the wrong place.
|
||||||
|
--write_file $MYSQLTEST_VARDIR/tmp/mysqld.1.expect
|
||||||
|
wait-binlog_xa_recover.test
|
||||||
|
EOF
|
||||||
|
SET SESSION debug_dbug="+d,crash_commit_after_log";
|
||||||
|
--error 2006,2013
|
||||||
|
INSERT INTO t1 VALUES (14, NULL);
|
||||||
|
|
||||||
|
--append_file $MYSQLTEST_VARDIR/tmp/mysqld.1.expect
|
||||||
|
restart-group_commit_binlog_pos.test
|
||||||
|
EOF
|
||||||
|
|
||||||
|
connection default;
|
||||||
|
--enable_reconnect
|
||||||
|
--source include/wait_until_connected_again.inc
|
||||||
|
|
||||||
|
# Check that all transactions are recovered.
|
||||||
|
SELECT a FROM t1 ORDER BY a;
|
||||||
|
|
||||||
|
|
||||||
|
--echo *** Check that recovery works if we crashed early during rotate, before
|
||||||
|
--echo *** binlog checkpoint event could be written.
|
||||||
|
|
||||||
|
SET GLOBAL max_binlog_size= 4096;
|
||||||
|
SET GLOBAL innodb_flush_log_at_trx_commit= 1;
|
||||||
|
RESET MASTER;
|
||||||
|
|
||||||
|
# We need some initial data to reach binlog master-bin.000004. Otherwise
|
||||||
|
# crash recovery fails due to the error insert used for previous test.
|
||||||
|
INSERT INTO t1 VALUES (21, REPEAT("x", 4100));
|
||||||
|
INSERT INTO t1 VALUES (22, REPEAT("x", 4100));
|
||||||
|
# Wait for the master-bin.000003 binlog checkpoint to appear.
|
||||||
|
--let $wait_for_all= 0
|
||||||
|
--let $show_statement= SHOW BINLOG EVENTS IN "master-bin.000003"
|
||||||
|
--let $field= Info
|
||||||
|
--let $condition= = "master-bin.000003"
|
||||||
|
--source include/wait_show_condition.inc
|
||||||
|
INSERT INTO t1 VALUES (23, REPEAT("x", 4100));
|
||||||
|
# Wait for the last (master-bin.000004) binlog checkpoint to appear.
|
||||||
|
--let $wait_for_all= 0
|
||||||
|
--let $show_statement= SHOW BINLOG EVENTS IN "master-bin.000004"
|
||||||
|
--let $field= Info
|
||||||
|
--let $condition= = "master-bin.000004"
|
||||||
|
--source include/wait_show_condition.inc
|
||||||
|
|
||||||
|
--write_file $MYSQLTEST_VARDIR/tmp/mysqld.1.expect
|
||||||
|
wait-binlog_xa_recover.test
|
||||||
|
EOF
|
||||||
|
SET SESSION debug_dbug="+d,crash_before_write_checkpoint_event";
|
||||||
|
--error 2006,2013
|
||||||
|
INSERT INTO t1 VALUES (24, REPEAT("x", 4100));
|
||||||
|
|
||||||
|
--append_file $MYSQLTEST_VARDIR/tmp/mysqld.1.expect
|
||||||
|
restart-group_commit_binlog_pos.test
|
||||||
|
EOF
|
||||||
|
|
||||||
|
--enable_reconnect
|
||||||
|
--source include/wait_until_connected_again.inc
|
||||||
|
|
||||||
|
# Check that all transactions are recovered.
|
||||||
|
SELECT a FROM t1 ORDER BY a;
|
||||||
|
|
||||||
|
--source include/show_binary_logs.inc
|
||||||
|
--let $binlog_file= master-bin.000004
|
||||||
|
--let $binlog_start= 4
|
||||||
|
--source include/show_binlog_events.inc
|
||||||
|
|
||||||
|
# Cleanup
|
||||||
|
connection default;
|
||||||
|
DROP TABLE t1;
|
||||||
|
@ -1 +0,0 @@
|
|||||||
--skip-stack-trace --skip-core-file --loose-debug-dbug=+d,xa_recover_expect_master_bin_000004
|
|
@ -151,30 +151,12 @@ master-bin.000004 # Xid # # COMMIT /* XID */
|
|||||||
SET DEBUG_SYNC= "now SIGNAL con10_cont";
|
SET DEBUG_SYNC= "now SIGNAL con10_cont";
|
||||||
connection con10;
|
connection con10;
|
||||||
connection default;
|
connection default;
|
||||||
SET @old_dbug= @@global.DEBUG_DBUG;
|
|
||||||
SET GLOBAL debug_dbug="+d,binlog_background_checkpoint_processed";
|
|
||||||
SET DEBUG_SYNC= "now WAIT_FOR binlog_background_checkpoint_processed";
|
|
||||||
SET DEBUG_SYNC= "now SIGNAL con12_cont";
|
SET DEBUG_SYNC= "now SIGNAL con12_cont";
|
||||||
connection con12;
|
connection con12;
|
||||||
connection default;
|
connection default;
|
||||||
SET GLOBAL debug_dbug= @old_dbug;
|
|
||||||
SET DEBUG_SYNC= "now SIGNAL con11_cont";
|
SET DEBUG_SYNC= "now SIGNAL con11_cont";
|
||||||
connection con11;
|
connection con11;
|
||||||
connection default;
|
connection default;
|
||||||
Checking that master-bin.000004 is the last binlog checkpoint
|
|
||||||
include/show_binlog_events.inc
|
|
||||||
Log_name Pos Event_type Server_id End_log_pos Info
|
|
||||||
master-bin.000004 # Format_desc # # SERVER_VERSION, BINLOG_VERSION
|
|
||||||
master-bin.000004 # Start_encryption # #
|
|
||||||
master-bin.000004 # Gtid_list # # [#-#-#]
|
|
||||||
master-bin.000004 # Binlog_checkpoint # # master-bin.000001
|
|
||||||
master-bin.000004 # Gtid # # BEGIN GTID #-#-#
|
|
||||||
master-bin.000004 # Annotate_rows # # INSERT INTO t1 VALUES (13, NULL)
|
|
||||||
master-bin.000004 # Table_map # # table_id: # (test.t1)
|
|
||||||
master-bin.000004 # Write_rows_v1 # # table_id: # flags: STMT_END_F
|
|
||||||
master-bin.000004 # Xid # # COMMIT /* XID */
|
|
||||||
master-bin.000004 # Binlog_checkpoint # # master-bin.000002
|
|
||||||
master-bin.000004 # Binlog_checkpoint # # master-bin.000004
|
|
||||||
Now crash the server
|
Now crash the server
|
||||||
SET SESSION debug_dbug="+d,crash_commit_after_log";
|
SET SESSION debug_dbug="+d,crash_commit_after_log";
|
||||||
INSERT INTO t1 VALUES (14, NULL);
|
INSERT INTO t1 VALUES (14, NULL);
|
||||||
|
@ -1 +1 @@
|
|||||||
--source suite/binlog/include/binlog_xa_recover.inc
|
--source suite/binlog/t/binlog_xa_recover.test
|
||||||
|
@ -110,15 +110,12 @@ Warnings:
|
|||||||
Warning 1264 Out of range value for column 'c1' at row 1
|
Warning 1264 Out of range value for column 'c1' at row 1
|
||||||
Warning 1264 Out of range value for column 'c2' at row 1
|
Warning 1264 Out of range value for column 'c2' at row 1
|
||||||
Warning 1264 Out of range value for column 'c3' at row 1
|
Warning 1264 Out of range value for column 'c3' at row 1
|
||||||
Warning 1366 Incorrect decimal value: '1e+18446744073709551616' for column `test`.`t2`.`c1` at row 2
|
Warning 1264 Out of range value for column 'c1' at row 2
|
||||||
Warning 1366 Incorrect decimal value: '1e+18446744073709551616' for column `test`.`t2`.`c2` at row 2
|
Warning 1264 Out of range value for column 'c2' at row 2
|
||||||
Warning 1366 Incorrect decimal value: '1e+18446744073709551616' for column `test`.`t2`.`c3` at row 2
|
Warning 1264 Out of range value for column 'c3' at row 2
|
||||||
Note 1265 Data truncated for column 'c1' at row 3
|
Note 1265 Data truncated for column 'c1' at row 3
|
||||||
Note 1265 Data truncated for column 'c2' at row 3
|
Note 1265 Data truncated for column 'c2' at row 3
|
||||||
Note 1265 Data truncated for column 'c3' at row 3
|
Note 1265 Data truncated for column 'c3' at row 3
|
||||||
Warning 1366 Incorrect decimal value: '1e-9223372036854775809' for column `test`.`t2`.`c1` at row 4
|
|
||||||
Warning 1366 Incorrect decimal value: '1e-9223372036854775809' for column `test`.`t2`.`c2` at row 4
|
|
||||||
Warning 1366 Incorrect decimal value: '1e-9223372036854775809' for column `test`.`t2`.`c3` at row 4
|
|
||||||
SELECT * FROM t1;
|
SELECT * FROM t1;
|
||||||
c1 c2 c3 c4
|
c1 c2 c3 c4
|
||||||
0.00000 -0.10000 0 13
|
0.00000 -0.10000 0 13
|
||||||
@ -142,7 +139,6 @@ c1 c2 c3 c4
|
|||||||
0 0 0 15
|
0 0 0 15
|
||||||
0 0 0 26
|
0 0 0 26
|
||||||
0 0 0 29
|
0 0 0 29
|
||||||
0 0 0 31
|
|
||||||
0 0 0 32
|
0 0 0 32
|
||||||
0 0 0 33
|
0 0 0 33
|
||||||
0 0 0 7
|
0 0 0 7
|
||||||
@ -160,6 +156,7 @@ c1 c2 c3 c4
|
|||||||
9999999999 9999999999 9999999999 25
|
9999999999 9999999999 9999999999 25
|
||||||
9999999999 9999999999 9999999999 28
|
9999999999 9999999999 9999999999 28
|
||||||
9999999999 9999999999 9999999999 30
|
9999999999 9999999999 9999999999 30
|
||||||
|
9999999999 9999999999 9999999999 31
|
||||||
SELECT count(*) as total_rows, min(c1) as min_value, max(c1) as max_value, sum(c1) as sum, avg(c1) as avg FROM t1;
|
SELECT count(*) as total_rows, min(c1) as min_value, max(c1) as max_value, sum(c1) as sum, avg(c1) as avg FROM t1;
|
||||||
total_rows min_value max_value sum avg
|
total_rows min_value max_value sum avg
|
||||||
7 0.00000 99999.99999 212446.04999 30349.435712857
|
7 0.00000 99999.99999 212446.04999 30349.435712857
|
||||||
@ -171,13 +168,13 @@ total_rows min_value max_value sum avg
|
|||||||
7 0 111111111 111211212 18535202.0000
|
7 0 111111111 111211212 18535202.0000
|
||||||
SELECT count(*) as total_rows, min(c1) as min_value, max(c1) as max_value, sum(c1) as sum, avg(c1) as avg FROM t2;
|
SELECT count(*) as total_rows, min(c1) as min_value, max(c1) as max_value, sum(c1) as sum, avg(c1) as avg FROM t2;
|
||||||
total_rows min_value max_value sum avg
|
total_rows min_value max_value sum avg
|
||||||
30 -9999999999 9999999999 21322222222 710740740.7333
|
30 -9999999999 9999999999 31322222221 1044074074.0333
|
||||||
SELECT count(*) as total_rows, min(c2) as min_value, max(c2) as max_value, sum(c2) as sum, avg(c2) as avg FROM t2;
|
SELECT count(*) as total_rows, min(c2) as min_value, max(c2) as max_value, sum(c2) as sum, avg(c2) as avg FROM t2;
|
||||||
total_rows min_value max_value sum avg
|
total_rows min_value max_value sum avg
|
||||||
30 0 9999999999 33444444445 1114814814.8333
|
30 0 9999999999 43444444444 1448148148.1333
|
||||||
SELECT count(*) as total_rows, min(c3) as min_value, max(c3) as max_value, sum(c3) as sum, avg(c3) as avg FROM t2;
|
SELECT count(*) as total_rows, min(c3) as min_value, max(c3) as max_value, sum(c3) as sum, avg(c3) as avg FROM t2;
|
||||||
total_rows min_value max_value sum avg
|
total_rows min_value max_value sum avg
|
||||||
30 -9999999999 9999999999 43322222220 1444074074.0000
|
30 -9999999999 9999999999 53322222219 1777407407.3000
|
||||||
SELECT * FROM t1;
|
SELECT * FROM t1;
|
||||||
c1 c2 c3 c4
|
c1 c2 c3 c4
|
||||||
0.00000 -0.10000 0 13
|
0.00000 -0.10000 0 13
|
||||||
|
@ -17,12 +17,12 @@ MW-329 : MDEV-19962 Galera test failure on MW-329
|
|||||||
galera_as_slave_replication_bundle : MDEV-15785 OPTION_GTID_BEGIN is set in Gtid_log_event::do_apply_event()
|
galera_as_slave_replication_bundle : MDEV-15785 OPTION_GTID_BEGIN is set in Gtid_log_event::do_apply_event()
|
||||||
galera_bf_lock_wait : MDEV-24649 galera.galera_bf_lock_wait MTR failed with sigabrt: Assertion `!is_owned()' failed in sync0policy.ic on MutexDebug with Mutex = TTASEventMutex<GenericPolicy>
|
galera_bf_lock_wait : MDEV-24649 galera.galera_bf_lock_wait MTR failed with sigabrt: Assertion `!is_owned()' failed in sync0policy.ic on MutexDebug with Mutex = TTASEventMutex<GenericPolicy>
|
||||||
galera_binlog_stmt_autoinc : MDEV-19959 Galera test failure on galera_binlog_stmt_autoinc
|
galera_binlog_stmt_autoinc : MDEV-19959 Galera test failure on galera_binlog_stmt_autoinc
|
||||||
|
galera_concurrent_ctas : MDEV-24842 Galera test failure on galera_concurrent_ctas
|
||||||
galera_gcache_recover_manytrx : MDEV-18834 Galera test failure
|
galera_gcache_recover_manytrx : MDEV-18834 Galera test failure
|
||||||
galera_mdl_race : MDEV-21524: galera.galera_mdl_race MTR failed: query 'reap' succeeded - should have failed with errno 1213
|
galera_mdl_race : MDEV-21524: galera.galera_mdl_race MTR failed: query 'reap' succeeded - should have failed with errno 1213
|
||||||
galera_parallel_simple : MDEV-20318 galera.galera_parallel_simple fails
|
galera_parallel_simple : MDEV-20318 galera.galera_parallel_simple fails
|
||||||
galera_partition : MDEV-21806: galera.galera_partition MTR failed: failed to recover from DONOR state
|
galera_partition : MDEV-21806: galera.galera_partition MTR failed: failed to recover from DONOR state
|
||||||
galera_shutdown_nonprim : MDEV-21493 galera.galera_shutdown_nonprim
|
galera_shutdown_nonprim : MDEV-21493 galera.galera_shutdown_nonprim
|
||||||
galera_ssl_upgrade : MDEV-19950 Galera test failure on galera_ssl_upgrade
|
|
||||||
galera_sst_mariabackup_encrypt_with_key : MDEV-21484 galera_sst_mariabackup_encrypt_with_key
|
galera_sst_mariabackup_encrypt_with_key : MDEV-21484 galera_sst_mariabackup_encrypt_with_key
|
||||||
galera_var_node_address : MDEV-20485 Galera test failure
|
galera_var_node_address : MDEV-20485 Galera test failure
|
||||||
galera_wan : MDEV-17259 Test failure on galera.galera_wan
|
galera_wan : MDEV-17259 Test failure on galera.galera_wan
|
||||||
|
8
mysql-test/suite/galera/include/galera_base_port.inc
Normal file
8
mysql-test/suite/galera/include/galera_base_port.inc
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
#
|
||||||
|
# Extract base_port from galera node.
|
||||||
|
#
|
||||||
|
|
||||||
|
# Convert "... base_port = N; ..." to "N; ..."
|
||||||
|
--let $s1 = `SELECT SUBSTR(@@wsrep_provider_options, LOCATE('base_port =', @@wsrep_provider_options) + LENGTH('base_port = '))`
|
||||||
|
# Convert "N; ..." to "N"
|
||||||
|
--let $_NODE_GALERAPORT = `SELECT SUBSTR('$s1', 1, LOCATE(';', '$s1') - 1)`
|
@ -4,12 +4,21 @@ VARIABLE_VALUE = 'Synced'
|
|||||||
SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
|
SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
|
||||||
VARIABLE_VALUE = 2
|
VARIABLE_VALUE = 2
|
||||||
1
|
1
|
||||||
|
connection node_1;
|
||||||
|
call mtr.add_suppression("WSREP: write_handler(): protocol is shutdown.*");
|
||||||
|
connection node_2;
|
||||||
|
call mtr.add_suppression("WSREP: write_handler(): protocol is shutdown.*");
|
||||||
|
connection node_1;
|
||||||
|
connection node_2;
|
||||||
|
connection node_1;
|
||||||
SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
|
SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
|
||||||
VARIABLE_VALUE = 2
|
VARIABLE_VALUE = 2
|
||||||
1
|
1
|
||||||
|
connection node_2;
|
||||||
SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
|
SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
|
||||||
VARIABLE_VALUE = 2
|
VARIABLE_VALUE = 2
|
||||||
1
|
1
|
||||||
|
connection node_1;
|
||||||
SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
|
SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
|
||||||
VARIABLE_VALUE = 2
|
VARIABLE_VALUE = 2
|
||||||
1
|
1
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
!include ../galera_2nodes.cnf
|
!include ../galera_2nodes.cnf
|
||||||
|
|
||||||
[mysqld.1]
|
[mysqld.1]
|
||||||
wsrep_provider_options='base_port=@mysqld.1.#galera_port;socket.ssl=yes;socket.ssl_cert=@ENV.MYSQL_TEST_DIR/std_data/cacert.pem;socket.ssl_key=@ENV.MYSQL_TEST_DIR/std_data/cakey.pem'
|
wsrep_provider_options='base_port=@mysqld.1.#galera_port;socket.ssl=yes;socket.ssl_cert=@ENV.MYSQL_TEST_DIR/std_data/galera-cert.pem;socket.ssl_key=@ENV.MYSQL_TEST_DIR/std_data/galera-key.pem'
|
||||||
|
|
||||||
[mysqld.2]
|
[mysqld.2]
|
||||||
wsrep_provider_options='base_port=@mysqld.2.#galera_port;socket.ssl=yes;socket.ssl_cert=@ENV.MYSQL_TEST_DIR/std_data/cacert.pem;socket.ssl_key=@ENV.MYSQL_TEST_DIR/std_data/cakey.pem'
|
wsrep_provider_options='base_port=@mysqld.2.#galera_port;socket.ssl=yes;socket.ssl_cert=@ENV.MYSQL_TEST_DIR/std_data/galera-cert.pem;socket.ssl_key=@ENV.MYSQL_TEST_DIR/std_data/galera-key.pem'
|
||||||
|
@ -6,15 +6,31 @@
|
|||||||
|
|
||||||
--source include/galera_cluster.inc
|
--source include/galera_cluster.inc
|
||||||
--source include/have_innodb.inc
|
--source include/have_innodb.inc
|
||||||
|
--source include/have_ssl_communication.inc
|
||||||
|
|
||||||
SELECT VARIABLE_VALUE = 'Synced' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state_comment';
|
SELECT VARIABLE_VALUE = 'Synced' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state_comment';
|
||||||
SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
|
SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
|
||||||
|
|
||||||
|
--connection node_1
|
||||||
|
call mtr.add_suppression("WSREP: write_handler(): protocol is shutdown.*");
|
||||||
|
--connection node_2
|
||||||
|
call mtr.add_suppression("WSREP: write_handler(): protocol is shutdown.*");
|
||||||
|
|
||||||
|
# Setup galera ports
|
||||||
|
--connection node_1
|
||||||
|
--source suite/galera/include/galera_base_port.inc
|
||||||
|
--let $NODE_GALERAPORT_1 = $_NODE_GALERAPORT
|
||||||
|
|
||||||
|
--connection node_2
|
||||||
|
--source suite/galera/include/galera_base_port.inc
|
||||||
|
--let $NODE_GALERAPORT_2 = $_NODE_GALERAPORT
|
||||||
|
|
||||||
# 2. Restart node #1 with a socket.ssl_ca that includes both the new and the old certificate
|
# 2. Restart node #1 with a socket.ssl_ca that includes both the new and the old certificate
|
||||||
|
|
||||||
--connection node_1
|
--connection node_1
|
||||||
--source include/shutdown_mysqld.inc
|
--source include/shutdown_mysqld.inc
|
||||||
--let $start_mysqld_params = --wsrep-cluster-address=gcomm://127.0.0.1:$NODE_GALERAPORT_2 --wsrep_provider_options=base_port=$NODE_GALERAPORT_1;socket.ssl=yes;socket.ssl_ca=$MYSQL_TEST_DIR/std_data/galera-upgrade-ca-cert.pem;socket.ssl_cert=$MYSQL_TEST_DIR/std_data/cacert.pem;socket.ssl_key=$MYSQL_TEST_DIR/std_data/cakey.pem
|
--let $restart_noprint = 1
|
||||||
|
--let $start_mysqld_params = --wsrep-cluster-address=gcomm://127.0.0.1:$NODE_GALERAPORT_2 --wsrep_provider_options=base_port=$NODE_GALERAPORT_1;socket.ssl=yes;socket.ssl_ca=$MYSQL_TEST_DIR/std_data/galera-upgrade-ca-cert.pem;socket.ssl_cert=$MYSQL_TEST_DIR/std_data/galera-cert.pem;socket.ssl_key=$MYSQL_TEST_DIR/std_data/galera-key.pem
|
||||||
--source include/start_mysqld.inc
|
--source include/start_mysqld.inc
|
||||||
--source include/wait_until_connected_again.inc
|
--source include/wait_until_connected_again.inc
|
||||||
|
|
||||||
|
@ -20,5 +20,6 @@ galera_ist_gcache_rollover : MDEV-23578 WSREP: exception caused by message: {v=0
|
|||||||
galera_load_data_ist : MDEV-24639 galera_3nodes.galera_load_data_ist MTR failed with SIGABRT: query 'reap' failed: 2013: Lost connection to MySQL server during query
|
galera_load_data_ist : MDEV-24639 galera_3nodes.galera_load_data_ist MTR failed with SIGABRT: query 'reap' failed: 2013: Lost connection to MySQL server during query
|
||||||
galera_load_data_ist : MDEV-24639 galera_3nodes.galera_load_data_ist MTR failed with SIGABRT: query 'reap' failed: 2013: Lost connection to MySQL server during query
|
galera_load_data_ist : MDEV-24639 galera_3nodes.galera_load_data_ist MTR failed with SIGABRT: query 'reap' failed: 2013: Lost connection to MySQL server during query
|
||||||
galera_pc_bootstrap : MDEV-24650 galera_pc_bootstrap MTR failed: Could not execute 'check-testcase' before testcase
|
galera_pc_bootstrap : MDEV-24650 galera_pc_bootstrap MTR failed: Could not execute 'check-testcase' before testcase
|
||||||
|
galera_safe_to_bootstrap : MDEV-24097 galera_3nodes.galera_safe_to_bootstrap MTR sporadaically fails: Failed to start mysqld or mysql_shutdown failed
|
||||||
galera_slave_options_do : MDEV-8798
|
galera_slave_options_do : MDEV-8798
|
||||||
galera_slave_options_ignore : MDEV-8798
|
galera_slave_options_ignore : MDEV-8798
|
||||||
|
@ -14,16 +14,10 @@ SET DEBUG_SYNC = 'now SIGNAL dml_pause';
|
|||||||
SET DEBUG_SYNC = 'now WAIT_FOR dml_restart';
|
SET DEBUG_SYNC = 'now WAIT_FOR dml_restart';
|
||||||
ROLLBACK;
|
ROLLBACK;
|
||||||
BEGIN;
|
BEGIN;
|
||||||
INSERT INTO t1 SELECT '','','','','','','','' FROM seq_1_to_16384;
|
INSERT INTO t1 SELECT '','','','','','','','' FROM seq_1_to_81920;
|
||||||
INSERT INTO t1 SELECT '','','','','','','','' FROM seq_1_to_16384;
|
|
||||||
INSERT INTO t1 SELECT '','','','','','','','' FROM seq_1_to_16384;
|
|
||||||
INSERT INTO t1 SELECT '','','','','','','','' FROM seq_1_to_16384;
|
|
||||||
INSERT INTO t1 SELECT '','','','','','','','' FROM seq_1_to_16384;
|
|
||||||
ROLLBACK;
|
ROLLBACK;
|
||||||
BEGIN;
|
BEGIN;
|
||||||
INSERT INTO t1 SELECT * FROM t1;
|
INSERT INTO t1 SELECT '','','','','','','','' FROM seq_1_to_114688;
|
||||||
INSERT INTO t1 SELECT * FROM t1;
|
|
||||||
INSERT INTO t1 SELECT * FROM t1;
|
|
||||||
ROLLBACK;
|
ROLLBACK;
|
||||||
SET DEBUG_SYNC = 'now SIGNAL dml_done';
|
SET DEBUG_SYNC = 'now SIGNAL dml_done';
|
||||||
connect con2, localhost,root,,test;
|
connect con2, localhost,root,,test;
|
||||||
|
@ -70,3 +70,19 @@ ERROR HY000: Tablespace has been discarded for table `t`
|
|||||||
ALTER TABLE t FORCE;
|
ALTER TABLE t FORCE;
|
||||||
ERROR HY000: Tablespace has been discarded for table `t`
|
ERROR HY000: Tablespace has been discarded for table `t`
|
||||||
DROP TABLE t;
|
DROP TABLE t;
|
||||||
|
#
|
||||||
|
# MDEV-24763 ALTER TABLE fails to rename a column in SYS_FIELDS
|
||||||
|
#
|
||||||
|
CREATE TABLE t1 (a INT, b TEXT, c INT, PRIMARY KEY(b(9)), INDEX(c,a))
|
||||||
|
ENGINE=InnoDB;
|
||||||
|
ALTER TABLE t1 CHANGE COLUMN a u INT;
|
||||||
|
SELECT sf.* FROM information_schema.innodb_sys_fields sf
|
||||||
|
INNER JOIN information_schema.innodb_sys_indexes si ON sf.index_id=si.index_id
|
||||||
|
INNER JOIN information_schema.innodb_sys_tables st ON si.table_id=st.table_id
|
||||||
|
WHERE st.name='test/t1' ORDER BY sf.index_id,sf.pos;
|
||||||
|
INDEX_ID NAME POS
|
||||||
|
ID b 0
|
||||||
|
ID c 0
|
||||||
|
ID u 1
|
||||||
|
DROP TABLE t1;
|
||||||
|
# End of 10.2 tests
|
||||||
|
@ -458,11 +458,18 @@ DROP TABLE t1;
|
|||||||
DROP PROCEDURE get_index_id;
|
DROP PROCEDURE get_index_id;
|
||||||
DROP PROCEDURE get_table_id;
|
DROP PROCEDURE get_table_id;
|
||||||
create table t (a varchar(100)) engine=innodb;
|
create table t (a varchar(100)) engine=innodb;
|
||||||
select name, pos, mtype, prtype, len from information_schema.innodb_sys_columns where name='a';
|
select sc.name, sc.pos, sc.mtype, sc.prtype, sc.len
|
||||||
|
from information_schema.innodb_sys_columns sc
|
||||||
|
inner join information_schema.innodb_sys_tables st
|
||||||
|
on sc.table_id=st.table_id where st.name='test/t' and sc.name='a';
|
||||||
name pos mtype prtype len
|
name pos mtype prtype len
|
||||||
a 0 1 524303 100
|
a 0 1 524303 100
|
||||||
alter table t modify a varchar(110), algorithm=inplace;
|
alter table t modify a varchar(110), algorithm=inplace;
|
||||||
select name, pos, mtype, prtype, len from information_schema.innodb_sys_columns where name='a';
|
select sc.name, sc.pos, sc.mtype, sc.prtype, sc.len
|
||||||
|
from information_schema.innodb_sys_columns sc
|
||||||
|
inner join information_schema.innodb_sys_tables st
|
||||||
|
on sc.table_id=st.table_id where st.name='test/t' and sc.name='a';
|
||||||
name pos mtype prtype len
|
name pos mtype prtype len
|
||||||
a 0 1 524303 110
|
a 0 1 524303 110
|
||||||
drop table t;
|
drop table t;
|
||||||
|
# End of 10.2 tests
|
||||||
|
@ -1,8 +0,0 @@
|
|||||||
CREATE TABLE t(a INT)ENGINE=InnoDB STATS_PERSISTENT=0;
|
|
||||||
RENAME TABLE t TO u;
|
|
||||||
DROP TABLE u;
|
|
||||||
SELECT @@innodb_fast_shutdown;
|
|
||||||
@@innodb_fast_shutdown
|
|
||||||
0
|
|
||||||
Last record of ID_IND root page (9):
|
|
||||||
18080000180500c0000000000000000c5359535f464f524549474e5f434f4c53
|
|
@ -25,17 +25,11 @@ SET DEBUG_SYNC = 'now WAIT_FOR dml_restart';
|
|||||||
ROLLBACK;
|
ROLLBACK;
|
||||||
|
|
||||||
BEGIN;
|
BEGIN;
|
||||||
INSERT INTO t1 SELECT '','','','','','','','' FROM seq_1_to_16384;
|
INSERT INTO t1 SELECT '','','','','','','','' FROM seq_1_to_81920;
|
||||||
INSERT INTO t1 SELECT '','','','','','','','' FROM seq_1_to_16384;
|
|
||||||
INSERT INTO t1 SELECT '','','','','','','','' FROM seq_1_to_16384;
|
|
||||||
INSERT INTO t1 SELECT '','','','','','','','' FROM seq_1_to_16384;
|
|
||||||
INSERT INTO t1 SELECT '','','','','','','','' FROM seq_1_to_16384;
|
|
||||||
ROLLBACK;
|
ROLLBACK;
|
||||||
|
|
||||||
BEGIN;
|
BEGIN;
|
||||||
INSERT INTO t1 SELECT * FROM t1;
|
INSERT INTO t1 SELECT '','','','','','','','' FROM seq_1_to_114688;
|
||||||
INSERT INTO t1 SELECT * FROM t1;
|
|
||||||
INSERT INTO t1 SELECT * FROM t1;
|
|
||||||
ROLLBACK;
|
ROLLBACK;
|
||||||
|
|
||||||
SET DEBUG_SYNC = 'now SIGNAL dml_done';
|
SET DEBUG_SYNC = 'now SIGNAL dml_done';
|
||||||
|
@ -79,3 +79,18 @@ ALTER TABLE t ENGINE INNODB;
|
|||||||
--error ER_TABLESPACE_DISCARDED
|
--error ER_TABLESPACE_DISCARDED
|
||||||
ALTER TABLE t FORCE;
|
ALTER TABLE t FORCE;
|
||||||
DROP TABLE t;
|
DROP TABLE t;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-24763 ALTER TABLE fails to rename a column in SYS_FIELDS
|
||||||
|
--echo #
|
||||||
|
CREATE TABLE t1 (a INT, b TEXT, c INT, PRIMARY KEY(b(9)), INDEX(c,a))
|
||||||
|
ENGINE=InnoDB;
|
||||||
|
ALTER TABLE t1 CHANGE COLUMN a u INT;
|
||||||
|
--replace_column 1 ID
|
||||||
|
SELECT sf.* FROM information_schema.innodb_sys_fields sf
|
||||||
|
INNER JOIN information_schema.innodb_sys_indexes si ON sf.index_id=si.index_id
|
||||||
|
INNER JOIN information_schema.innodb_sys_tables st ON si.table_id=st.table_id
|
||||||
|
WHERE st.name='test/t1' ORDER BY sf.index_id,sf.pos;
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
--echo # End of 10.2 tests
|
||||||
|
@ -337,7 +337,15 @@ DROP PROCEDURE get_table_id;
|
|||||||
|
|
||||||
# LEN must increase here
|
# LEN must increase here
|
||||||
create table t (a varchar(100)) engine=innodb;
|
create table t (a varchar(100)) engine=innodb;
|
||||||
select name, pos, mtype, prtype, len from information_schema.innodb_sys_columns where name='a';
|
select sc.name, sc.pos, sc.mtype, sc.prtype, sc.len
|
||||||
|
from information_schema.innodb_sys_columns sc
|
||||||
|
inner join information_schema.innodb_sys_tables st
|
||||||
|
on sc.table_id=st.table_id where st.name='test/t' and sc.name='a';
|
||||||
alter table t modify a varchar(110), algorithm=inplace;
|
alter table t modify a varchar(110), algorithm=inplace;
|
||||||
select name, pos, mtype, prtype, len from information_schema.innodb_sys_columns where name='a';
|
select sc.name, sc.pos, sc.mtype, sc.prtype, sc.len
|
||||||
|
from information_schema.innodb_sys_columns sc
|
||||||
|
inner join information_schema.innodb_sys_tables st
|
||||||
|
on sc.table_id=st.table_id where st.name='test/t' and sc.name='a';
|
||||||
drop table t;
|
drop table t;
|
||||||
|
|
||||||
|
--echo # End of 10.2 tests
|
||||||
|
@ -1 +0,0 @@
|
|||||||
--innodb_fast_shutdown=0
|
|
@ -1,49 +0,0 @@
|
|||||||
# Bug #60049 Verify that purge leaves no garbage in unique secondary indexes
|
|
||||||
# This test requires a fresh server start-up and a slow shutdown.
|
|
||||||
# This was a suspected bug (not a bug).
|
|
||||||
|
|
||||||
-- source include/not_embedded.inc
|
|
||||||
-- source include/have_innodb.inc
|
|
||||||
-- source include/have_innodb_16k.inc
|
|
||||||
|
|
||||||
-- disable_query_log
|
|
||||||
call mtr.add_suppression('\\[ERROR\\] InnoDB: Table `mysql`.`innodb_(table|index)_stats` not found');
|
|
||||||
call mtr.add_suppression('\\[ERROR\\] InnoDB: Fetch of persistent statistics requested for table `mysql`.`gtid_executed`');
|
|
||||||
|
|
||||||
let $create1 = query_get_value(SHOW CREATE TABLE mysql.innodb_table_stats, Create Table, 1);
|
|
||||||
let $create2 = query_get_value(SHOW CREATE TABLE mysql.innodb_index_stats, Create Table, 1);
|
|
||||||
DROP TABLE mysql.innodb_index_stats;
|
|
||||||
DROP TABLE mysql.innodb_table_stats;
|
|
||||||
-- enable_query_log
|
|
||||||
|
|
||||||
CREATE TABLE t(a INT)ENGINE=InnoDB STATS_PERSISTENT=0;
|
|
||||||
RENAME TABLE t TO u;
|
|
||||||
DROP TABLE u;
|
|
||||||
SELECT @@innodb_fast_shutdown;
|
|
||||||
let $MYSQLD_DATADIR=`select @@datadir`;
|
|
||||||
|
|
||||||
--source include/shutdown_mysqld.inc
|
|
||||||
|
|
||||||
# Check the tail of ID_IND (SYS_TABLES.ID)
|
|
||||||
let IBDATA1=$MYSQLD_DATADIR/ibdata1;
|
|
||||||
perl;
|
|
||||||
my $file = $ENV{'IBDATA1'};
|
|
||||||
open(FILE, "<$file") || die "Unable to open $file";
|
|
||||||
# Read DICT_HDR_TABLE_IDS, the root page number of ID_IND (SYS_TABLES.ID).
|
|
||||||
seek(FILE, 7*16384+38+36, 0) || die "Unable to seek $file";
|
|
||||||
die unless read(FILE, $_, 4) == 4;
|
|
||||||
my $sys_tables_id_root = unpack("N", $_);
|
|
||||||
print "Last record of ID_IND root page ($sys_tables_id_root):\n";
|
|
||||||
# This should be the last record in ID_IND. Dump it in hexadecimal.
|
|
||||||
seek(FILE, $sys_tables_id_root*16384 + 152, 0) || die "Unable to seek $file";
|
|
||||||
read(FILE, $_, 32) || die "Unable to read $file";
|
|
||||||
close(FILE);
|
|
||||||
print unpack("H*", $_), "\n";
|
|
||||||
EOF
|
|
||||||
|
|
||||||
--source include/start_mysqld.inc
|
|
||||||
|
|
||||||
-- disable_query_log
|
|
||||||
USE mysql;
|
|
||||||
eval $create1;
|
|
||||||
eval $create2;
|
|
@ -1,7 +1,7 @@
|
|||||||
# This test case will test R-tree purge.
|
# This test case will test R-tree purge.
|
||||||
|
|
||||||
--source include/innodb_page_size.inc
|
--source include/innodb_page_size.inc
|
||||||
# Valgrind takes too much time on PB2 even in the --big-test runs.
|
--source include/have_sequence.inc
|
||||||
--source include/not_valgrind.inc
|
--source include/not_valgrind.inc
|
||||||
|
|
||||||
SET @saved_frequency = @@GLOBAL.innodb_purge_rseg_truncate_frequency;
|
SET @saved_frequency = @@GLOBAL.innodb_purge_rseg_truncate_frequency;
|
||||||
@ -16,9 +16,7 @@ set @p=point(1,1);
|
|||||||
let $n=200;
|
let $n=200;
|
||||||
while ($n) {
|
while ($n) {
|
||||||
begin;
|
begin;
|
||||||
insert into t values(@p,@p),(@p,@p);
|
insert into t select @p,@p from seq_1_to_130;
|
||||||
insert into t select @p,@p
|
|
||||||
from t a,t b,t c,t d,t e,t f,t g;
|
|
||||||
delete from t;
|
delete from t;
|
||||||
commit;
|
commit;
|
||||||
dec $n;
|
dec $n;
|
||||||
|
@ -22,4 +22,8 @@ n
|
|||||||
connection master;
|
connection master;
|
||||||
drop table t1;
|
drop table t1;
|
||||||
connection slave;
|
connection slave;
|
||||||
|
connection master;
|
||||||
|
CHANGE MASTER TO MASTER_USER='root', MASTER_SSL=0, MASTER_SSL_CA='', MASTER_SSL_CERT='',
|
||||||
|
MASTER_SSL_KEY='', MASTER_SSL_CRL='', MASTER_SSL_CRLPATH='';
|
||||||
|
CHANGE MASTER TO MASTER_USER='root', MASTER_PASSWORD='', MASTER_SSL=0;
|
||||||
include/rpl_end.inc
|
include/rpl_end.inc
|
||||||
|
@ -101,4 +101,11 @@ connection master;
|
|||||||
drop table t1;
|
drop table t1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
--connection master
|
||||||
|
# MDEV-22741: *SAN: ERROR: AddressSanitizer: use-after-poison on address in
|
||||||
|
# instrings/strmake.c:36 from change_master (on optimized builds)
|
||||||
|
CHANGE MASTER TO MASTER_USER='root', MASTER_SSL=0, MASTER_SSL_CA='', MASTER_SSL_CERT='',
|
||||||
|
MASTER_SSL_KEY='', MASTER_SSL_CRL='', MASTER_SSL_CRLPATH='';
|
||||||
|
CHANGE MASTER TO MASTER_USER='root', MASTER_PASSWORD='', MASTER_SSL=0;
|
||||||
|
|
||||||
--source include/rpl_end.inc
|
--source include/rpl_end.inc
|
||||||
|
@ -132,16 +132,7 @@ drop user test@localhost;
|
|||||||
#
|
#
|
||||||
SET @wsrep_sst_auth_saved= @@global.wsrep_sst_auth;
|
SET @wsrep_sst_auth_saved= @@global.wsrep_sst_auth;
|
||||||
SET @@global.wsrep_sst_auth= 'user:pass';
|
SET @@global.wsrep_sst_auth= 'user:pass';
|
||||||
SELECT @@global.wsrep_sst_auth;
|
|
||||||
@@global.wsrep_sst_auth
|
|
||||||
********
|
|
||||||
SET @@global.wsrep_sst_auth= '';
|
SET @@global.wsrep_sst_auth= '';
|
||||||
SELECT @@global.wsrep_sst_auth;
|
|
||||||
@@global.wsrep_sst_auth
|
|
||||||
NULL
|
|
||||||
SET @@global.wsrep_sst_auth= NULL;
|
SET @@global.wsrep_sst_auth= NULL;
|
||||||
SELECT @@global.wsrep_sst_auth;
|
|
||||||
@@global.wsrep_sst_auth
|
|
||||||
NULL
|
|
||||||
SET @@global.wsrep_sst_auth= @wsrep_sst_auth_saved;
|
SET @@global.wsrep_sst_auth= @wsrep_sst_auth_saved;
|
||||||
# End of test.
|
# End of test.
|
||||||
|
@ -141,11 +141,8 @@ drop user test@localhost;
|
|||||||
--echo #
|
--echo #
|
||||||
SET @wsrep_sst_auth_saved= @@global.wsrep_sst_auth;
|
SET @wsrep_sst_auth_saved= @@global.wsrep_sst_auth;
|
||||||
SET @@global.wsrep_sst_auth= 'user:pass';
|
SET @@global.wsrep_sst_auth= 'user:pass';
|
||||||
SELECT @@global.wsrep_sst_auth;
|
|
||||||
SET @@global.wsrep_sst_auth= '';
|
SET @@global.wsrep_sst_auth= '';
|
||||||
SELECT @@global.wsrep_sst_auth;
|
|
||||||
SET @@global.wsrep_sst_auth= NULL;
|
SET @@global.wsrep_sst_auth= NULL;
|
||||||
SELECT @@global.wsrep_sst_auth;
|
|
||||||
SET @@global.wsrep_sst_auth= @wsrep_sst_auth_saved;
|
SET @@global.wsrep_sst_auth= @wsrep_sst_auth_saved;
|
||||||
|
|
||||||
--source include/galera_wait_ready.inc
|
--source include/galera_wait_ready.inc
|
||||||
|
@ -377,7 +377,7 @@ bool Item_subselect::mark_as_eliminated_processor(void *arg)
|
|||||||
bool Item_subselect::eliminate_subselect_processor(void *arg)
|
bool Item_subselect::eliminate_subselect_processor(void *arg)
|
||||||
{
|
{
|
||||||
unit->item= NULL;
|
unit->item= NULL;
|
||||||
unit->exclude_from_tree();
|
unit->exclude();
|
||||||
eliminated= TRUE;
|
eliminated= TRUE;
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
@ -445,6 +445,26 @@ bool Item_subselect::mark_as_dependent(THD *thd, st_select_lex *select,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
@brief
|
||||||
|
Update the table bitmaps for the outer references used within a subquery
|
||||||
|
*/
|
||||||
|
|
||||||
|
bool Item_subselect::update_table_bitmaps_processor(void *arg)
|
||||||
|
{
|
||||||
|
List_iterator<Ref_to_outside> it(upper_refs);
|
||||||
|
Ref_to_outside *upper;
|
||||||
|
|
||||||
|
while ((upper= it++))
|
||||||
|
{
|
||||||
|
if (upper->item &&
|
||||||
|
upper->item->walk(&Item::update_table_bitmaps_processor, FALSE, arg))
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Adjust attributes after our parent select has been merged into grandparent
|
Adjust attributes after our parent select has been merged into grandparent
|
||||||
|
|
||||||
|
@ -250,6 +250,7 @@ public:
|
|||||||
@retval FALSE otherwise
|
@retval FALSE otherwise
|
||||||
*/
|
*/
|
||||||
bool is_expensive_processor(void *arg) { return is_expensive(); }
|
bool is_expensive_processor(void *arg) { return is_expensive(); }
|
||||||
|
bool update_table_bitmaps_processor(void *arg);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Get the SELECT_LEX structure associated with this Item.
|
Get the SELECT_LEX structure associated with this Item.
|
||||||
|
@ -4983,11 +4983,13 @@ thd_need_ordering_with(const MYSQL_THD thd, const MYSQL_THD other_thd)
|
|||||||
#ifdef WITH_WSREP
|
#ifdef WITH_WSREP
|
||||||
/* wsrep applier, replayer and TOI processing threads are ordered
|
/* wsrep applier, replayer and TOI processing threads are ordered
|
||||||
by replication provider, relaxed GAP locking protocol can be used
|
by replication provider, relaxed GAP locking protocol can be used
|
||||||
between high priority wsrep threads
|
between high priority wsrep threads. Note that this function
|
||||||
|
is called while holding lock_sys mutex, therefore we can't
|
||||||
|
use THD::LOCK_thd_data mutex below to follow mutex ordering rules.
|
||||||
*/
|
*/
|
||||||
if (WSREP_ON &&
|
if (WSREP_ON &&
|
||||||
wsrep_thd_is_BF(const_cast<THD *>(thd), false) &&
|
wsrep_thd_is_BF(const_cast<THD *>(thd), false) &&
|
||||||
wsrep_thd_is_BF(const_cast<THD *>(other_thd), true))
|
wsrep_thd_is_BF(const_cast<THD *>(other_thd), false))
|
||||||
return 0;
|
return 0;
|
||||||
#endif /* WITH_WSREP */
|
#endif /* WITH_WSREP */
|
||||||
rgi= thd->rgi_slave;
|
rgi= thd->rgi_slave;
|
||||||
|
@ -464,7 +464,7 @@ struct LEX_MASTER_INFO
|
|||||||
}
|
}
|
||||||
|
|
||||||
host= user= password= log_file_name= ssl_key= ssl_cert= ssl_ca=
|
host= user= password= log_file_name= ssl_key= ssl_cert= ssl_ca=
|
||||||
ssl_capath= ssl_cipher= relay_log_name= 0;
|
ssl_capath= ssl_cipher= ssl_crl= ssl_crlpath= relay_log_name= NULL;
|
||||||
pos= relay_log_pos= server_id= port= connect_retry= 0;
|
pos= relay_log_pos= server_id= port= connect_retry= 0;
|
||||||
heartbeat_period= 0;
|
heartbeat_period= 0;
|
||||||
ssl= ssl_verify_server_cert= heartbeat_opt=
|
ssl= ssl_verify_server_cert= heartbeat_opt=
|
||||||
|
@ -1063,22 +1063,6 @@ JOIN::prepare(TABLE_LIST *tables_init,
|
|||||||
FALSE, SELECT_ACL, SELECT_ACL, FALSE))
|
FALSE, SELECT_ACL, SELECT_ACL, FALSE))
|
||||||
DBUG_RETURN(-1);
|
DBUG_RETURN(-1);
|
||||||
|
|
||||||
/*
|
|
||||||
Permanently remove redundant parts from the query if
|
|
||||||
1) This is a subquery
|
|
||||||
2) This is the first time this query is optimized (since the
|
|
||||||
transformation is permanent
|
|
||||||
3) Not normalizing a view. Removal should take place when a
|
|
||||||
query involving a view is optimized, not when the view
|
|
||||||
is created
|
|
||||||
*/
|
|
||||||
if (select_lex->master_unit()->item && // 1)
|
|
||||||
select_lex->first_cond_optimization && // 2)
|
|
||||||
!thd->lex->is_view_context_analysis()) // 3)
|
|
||||||
{
|
|
||||||
remove_redundant_subquery_clauses(select_lex);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* System Versioning: handle FOR SYSTEM_TIME clause. */
|
/* System Versioning: handle FOR SYSTEM_TIME clause. */
|
||||||
if (select_lex->vers_setup_conds(thd, tables_list) < 0)
|
if (select_lex->vers_setup_conds(thd, tables_list) < 0)
|
||||||
DBUG_RETURN(-1);
|
DBUG_RETURN(-1);
|
||||||
@ -1161,6 +1145,23 @@ JOIN::prepare(TABLE_LIST *tables_init,
|
|||||||
&hidden_group_fields,
|
&hidden_group_fields,
|
||||||
&select_lex->select_n_reserved))
|
&select_lex->select_n_reserved))
|
||||||
DBUG_RETURN(-1);
|
DBUG_RETURN(-1);
|
||||||
|
|
||||||
|
/*
|
||||||
|
Permanently remove redundant parts from the query if
|
||||||
|
1) This is a subquery
|
||||||
|
2) This is the first time this query is optimized (since the
|
||||||
|
transformation is permanent
|
||||||
|
3) Not normalizing a view. Removal should take place when a
|
||||||
|
query involving a view is optimized, not when the view
|
||||||
|
is created
|
||||||
|
*/
|
||||||
|
if (select_lex->master_unit()->item && // 1)
|
||||||
|
select_lex->first_cond_optimization && // 2)
|
||||||
|
!thd->lex->is_view_context_analysis()) // 3)
|
||||||
|
{
|
||||||
|
remove_redundant_subquery_clauses(select_lex);
|
||||||
|
}
|
||||||
|
|
||||||
/* Resolve the ORDER BY that was skipped, then remove it. */
|
/* Resolve the ORDER BY that was skipped, then remove it. */
|
||||||
if (skip_order_by && select_lex !=
|
if (skip_order_by && select_lex !=
|
||||||
select_lex->master_unit()->global_parameters())
|
select_lex->master_unit()->global_parameters())
|
||||||
|
@ -1041,14 +1041,14 @@ public:
|
|||||||
|
|
||||||
void store_stat_fields()
|
void store_stat_fields()
|
||||||
{
|
{
|
||||||
char buff[MAX_FIELD_WIDTH];
|
StringBuffer<MAX_FIELD_WIDTH> val;
|
||||||
String val(buff, sizeof(buff), &my_charset_bin);
|
|
||||||
|
|
||||||
MY_BITMAP *old_map= dbug_tmp_use_all_columns(stat_table, &stat_table->read_set);
|
MY_BITMAP *old_map= dbug_tmp_use_all_columns(stat_table, &stat_table->read_set);
|
||||||
for (uint i= COLUMN_STAT_MIN_VALUE; i <= COLUMN_STAT_HISTOGRAM; i++)
|
for (uint i= COLUMN_STAT_MIN_VALUE; i <= COLUMN_STAT_HISTOGRAM; i++)
|
||||||
{
|
{
|
||||||
Field *stat_field= stat_table->field[i];
|
Field *stat_field= stat_table->field[i];
|
||||||
if (table_field->collected_stats->is_null(i))
|
Column_statistics *stats= table_field->collected_stats;
|
||||||
|
if (stats->is_null(i))
|
||||||
stat_field->set_null();
|
stat_field->set_null();
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -1056,10 +1056,10 @@ public:
|
|||||||
switch (i) {
|
switch (i) {
|
||||||
case COLUMN_STAT_MIN_VALUE:
|
case COLUMN_STAT_MIN_VALUE:
|
||||||
if (table_field->type() == MYSQL_TYPE_BIT)
|
if (table_field->type() == MYSQL_TYPE_BIT)
|
||||||
stat_field->store(table_field->collected_stats->min_value->val_int(),true);
|
stat_field->store(stats->min_value->val_int(),true);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
table_field->collected_stats->min_value->val_str(&val);
|
stats->min_value->val_str(&val);
|
||||||
size_t length= Well_formed_prefix(val.charset(), val.ptr(),
|
size_t length= Well_formed_prefix(val.charset(), val.ptr(),
|
||||||
MY_MIN(val.length(), stat_field->field_length)).length();
|
MY_MIN(val.length(), stat_field->field_length)).length();
|
||||||
stat_field->store(val.ptr(), length, &my_charset_bin);
|
stat_field->store(val.ptr(), length, &my_charset_bin);
|
||||||
@ -1067,37 +1067,33 @@ public:
|
|||||||
break;
|
break;
|
||||||
case COLUMN_STAT_MAX_VALUE:
|
case COLUMN_STAT_MAX_VALUE:
|
||||||
if (table_field->type() == MYSQL_TYPE_BIT)
|
if (table_field->type() == MYSQL_TYPE_BIT)
|
||||||
stat_field->store(table_field->collected_stats->max_value->val_int(),true);
|
stat_field->store(stats->max_value->val_int(),true);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
table_field->collected_stats->max_value->val_str(&val);
|
stats->max_value->val_str(&val);
|
||||||
size_t length= Well_formed_prefix(val.charset(), val.ptr(),
|
size_t length= Well_formed_prefix(val.charset(), val.ptr(),
|
||||||
MY_MIN(val.length(), stat_field->field_length)).length();
|
MY_MIN(val.length(), stat_field->field_length)).length();
|
||||||
stat_field->store(val.ptr(), length, &my_charset_bin);
|
stat_field->store(val.ptr(), length, &my_charset_bin);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case COLUMN_STAT_NULLS_RATIO:
|
case COLUMN_STAT_NULLS_RATIO:
|
||||||
stat_field->store(table_field->collected_stats->get_nulls_ratio());
|
stat_field->store(stats->get_nulls_ratio());
|
||||||
break;
|
break;
|
||||||
case COLUMN_STAT_AVG_LENGTH:
|
case COLUMN_STAT_AVG_LENGTH:
|
||||||
stat_field->store(table_field->collected_stats->get_avg_length());
|
stat_field->store(stats->get_avg_length());
|
||||||
break;
|
break;
|
||||||
case COLUMN_STAT_AVG_FREQUENCY:
|
case COLUMN_STAT_AVG_FREQUENCY:
|
||||||
stat_field->store(table_field->collected_stats->get_avg_frequency());
|
stat_field->store(stats->get_avg_frequency());
|
||||||
break;
|
break;
|
||||||
case COLUMN_STAT_HIST_SIZE:
|
case COLUMN_STAT_HIST_SIZE:
|
||||||
stat_field->store(table_field->collected_stats->histogram.get_size());
|
stat_field->store(stats->histogram.get_size());
|
||||||
break;
|
break;
|
||||||
case COLUMN_STAT_HIST_TYPE:
|
case COLUMN_STAT_HIST_TYPE:
|
||||||
stat_field->store(table_field->collected_stats->histogram.get_type() +
|
stat_field->store(stats->histogram.get_type() + 1);
|
||||||
1);
|
|
||||||
break;
|
break;
|
||||||
case COLUMN_STAT_HISTOGRAM:
|
case COLUMN_STAT_HISTOGRAM:
|
||||||
const char * col_histogram=
|
stat_field->store((char *)stats->histogram.get_values(),
|
||||||
(const char *) (table_field->collected_stats->histogram.get_values());
|
stats->histogram.get_size(), &my_charset_bin);
|
||||||
stat_field->store(col_histogram,
|
|
||||||
table_field->collected_stats->histogram.get_size(),
|
|
||||||
&my_charset_bin);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1152,16 +1148,30 @@ public:
|
|||||||
|
|
||||||
switch (i) {
|
switch (i) {
|
||||||
case COLUMN_STAT_MIN_VALUE:
|
case COLUMN_STAT_MIN_VALUE:
|
||||||
table_field->read_stats->min_value->set_notnull();
|
table_field->read_stats->min_value->set_notnull();
|
||||||
stat_field->val_str(&val);
|
if (table_field->type() == MYSQL_TYPE_BIT)
|
||||||
table_field->read_stats->min_value->store(val.ptr(), val.length(),
|
table_field->read_stats->min_value->store(stat_field->val_int(),
|
||||||
&my_charset_bin);
|
true);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
stat_field->val_str(&val);
|
||||||
|
table_field->read_stats->min_value->store(val.ptr(),
|
||||||
|
val.length(),
|
||||||
|
&my_charset_bin);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case COLUMN_STAT_MAX_VALUE:
|
case COLUMN_STAT_MAX_VALUE:
|
||||||
table_field->read_stats->max_value->set_notnull();
|
table_field->read_stats->max_value->set_notnull();
|
||||||
stat_field->val_str(&val);
|
if (table_field->type() == MYSQL_TYPE_BIT)
|
||||||
table_field->read_stats->max_value->store(val.ptr(), val.length(),
|
table_field->read_stats->max_value->store(stat_field->val_int(),
|
||||||
&my_charset_bin);
|
true);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
stat_field->val_str(&val);
|
||||||
|
table_field->read_stats->max_value->store(val.ptr(),
|
||||||
|
val.length(),
|
||||||
|
&my_charset_bin);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case COLUMN_STAT_NULLS_RATIO:
|
case COLUMN_STAT_NULLS_RATIO:
|
||||||
table_field->read_stats->set_nulls_ratio(stat_field->val_real());
|
table_field->read_stats->set_nulls_ratio(stat_field->val_real());
|
||||||
@ -2084,20 +2094,24 @@ void create_min_max_statistical_fields_for_table_share(THD *thd,
|
|||||||
int alloc_statistics_for_table(THD* thd, TABLE *table)
|
int alloc_statistics_for_table(THD* thd, TABLE *table)
|
||||||
{
|
{
|
||||||
Field **field_ptr;
|
Field **field_ptr;
|
||||||
uint fields;
|
|
||||||
|
|
||||||
DBUG_ENTER("alloc_statistics_for_table");
|
DBUG_ENTER("alloc_statistics_for_table");
|
||||||
|
|
||||||
|
uint columns= 0;
|
||||||
|
for (field_ptr= table->field; *field_ptr; field_ptr++)
|
||||||
|
{
|
||||||
|
if (bitmap_is_set(table->read_set, (*field_ptr)->field_index))
|
||||||
|
columns++;
|
||||||
|
}
|
||||||
|
|
||||||
Table_statistics *table_stats=
|
Table_statistics *table_stats=
|
||||||
(Table_statistics *) alloc_root(&table->mem_root,
|
(Table_statistics *) alloc_root(&table->mem_root,
|
||||||
sizeof(Table_statistics));
|
sizeof(Table_statistics));
|
||||||
|
|
||||||
fields= table->s->fields ;
|
|
||||||
Column_statistics_collected *column_stats=
|
Column_statistics_collected *column_stats=
|
||||||
(Column_statistics_collected *) alloc_root(&table->mem_root,
|
(Column_statistics_collected *) alloc_root(&table->mem_root,
|
||||||
sizeof(Column_statistics_collected) *
|
sizeof(Column_statistics_collected) *
|
||||||
(fields+1));
|
columns);
|
||||||
|
|
||||||
uint keys= table->s->keys;
|
uint keys= table->s->keys;
|
||||||
Index_statistics *index_stats=
|
Index_statistics *index_stats=
|
||||||
@ -2108,16 +2122,6 @@ int alloc_statistics_for_table(THD* thd, TABLE *table)
|
|||||||
ulonglong *idx_avg_frequency= (ulonglong*) alloc_root(&table->mem_root,
|
ulonglong *idx_avg_frequency= (ulonglong*) alloc_root(&table->mem_root,
|
||||||
sizeof(ulonglong) * key_parts);
|
sizeof(ulonglong) * key_parts);
|
||||||
|
|
||||||
if (table->file->ha_rnd_init(TRUE))
|
|
||||||
DBUG_RETURN(1);
|
|
||||||
table->file->ha_rnd_end();
|
|
||||||
|
|
||||||
uint columns= 0;
|
|
||||||
for (field_ptr= table->field; *field_ptr; field_ptr++)
|
|
||||||
{
|
|
||||||
if (bitmap_is_set(table->read_set, (*field_ptr)->field_index))
|
|
||||||
columns++;
|
|
||||||
}
|
|
||||||
uint hist_size= thd->variables.histogram_size;
|
uint hist_size= thd->variables.histogram_size;
|
||||||
Histogram_type hist_type= (Histogram_type) (thd->variables.histogram_type);
|
Histogram_type hist_type= (Histogram_type) (thd->variables.histogram_type);
|
||||||
uchar *histogram= NULL;
|
uchar *histogram= NULL;
|
||||||
@ -2139,19 +2143,17 @@ int alloc_statistics_for_table(THD* thd, TABLE *table)
|
|||||||
table_stats->idx_avg_frequency= idx_avg_frequency;
|
table_stats->idx_avg_frequency= idx_avg_frequency;
|
||||||
table_stats->histograms= histogram;
|
table_stats->histograms= histogram;
|
||||||
|
|
||||||
memset(column_stats, 0, sizeof(Column_statistics) * (fields+1));
|
memset(column_stats, 0, sizeof(Column_statistics) * columns);
|
||||||
|
|
||||||
for (field_ptr= table->field; *field_ptr; field_ptr++, column_stats++)
|
for (field_ptr= table->field; *field_ptr; field_ptr++)
|
||||||
{
|
{
|
||||||
(*field_ptr)->collected_stats= column_stats;
|
|
||||||
(*field_ptr)->collected_stats->max_value= NULL;
|
|
||||||
(*field_ptr)->collected_stats->min_value= NULL;
|
|
||||||
if (bitmap_is_set(table->read_set, (*field_ptr)->field_index))
|
if (bitmap_is_set(table->read_set, (*field_ptr)->field_index))
|
||||||
{
|
{
|
||||||
column_stats->histogram.set_size(hist_size);
|
column_stats->histogram.set_size(hist_size);
|
||||||
column_stats->histogram.set_type(hist_type);
|
column_stats->histogram.set_type(hist_type);
|
||||||
column_stats->histogram.set_values(histogram);
|
column_stats->histogram.set_values(histogram);
|
||||||
histogram+= hist_size;
|
histogram+= hist_size;
|
||||||
|
(*field_ptr)->collected_stats= column_stats++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2600,7 +2602,7 @@ int collect_statistics_for_table(THD *thd, TABLE *table)
|
|||||||
for (field_ptr= table->field; *field_ptr; field_ptr++)
|
for (field_ptr= table->field; *field_ptr; field_ptr++)
|
||||||
{
|
{
|
||||||
table_field= *field_ptr;
|
table_field= *field_ptr;
|
||||||
if (!bitmap_is_set(table->read_set, table_field->field_index))
|
if (!table_field->collected_stats)
|
||||||
continue;
|
continue;
|
||||||
table_field->collected_stats->init(thd, table_field);
|
table_field->collected_stats->init(thd, table_field);
|
||||||
}
|
}
|
||||||
@ -2623,7 +2625,7 @@ int collect_statistics_for_table(THD *thd, TABLE *table)
|
|||||||
for (field_ptr= table->field; *field_ptr; field_ptr++)
|
for (field_ptr= table->field; *field_ptr; field_ptr++)
|
||||||
{
|
{
|
||||||
table_field= *field_ptr;
|
table_field= *field_ptr;
|
||||||
if (!bitmap_is_set(table->read_set, table_field->field_index))
|
if (!table_field->collected_stats)
|
||||||
continue;
|
continue;
|
||||||
if ((rc= table_field->collected_stats->add(rows)))
|
if ((rc= table_field->collected_stats->add(rows)))
|
||||||
break;
|
break;
|
||||||
@ -2651,7 +2653,7 @@ int collect_statistics_for_table(THD *thd, TABLE *table)
|
|||||||
for (field_ptr= table->field; *field_ptr; field_ptr++)
|
for (field_ptr= table->field; *field_ptr; field_ptr++)
|
||||||
{
|
{
|
||||||
table_field= *field_ptr;
|
table_field= *field_ptr;
|
||||||
if (!bitmap_is_set(table->read_set, table_field->field_index))
|
if (!table_field->collected_stats)
|
||||||
continue;
|
continue;
|
||||||
bitmap_set_bit(table->write_set, table_field->field_index);
|
bitmap_set_bit(table->write_set, table_field->field_index);
|
||||||
if (!rc)
|
if (!rc)
|
||||||
@ -2755,7 +2757,7 @@ int update_statistics_for_table(THD *thd, TABLE *table)
|
|||||||
for (Field **field_ptr= table->field; *field_ptr; field_ptr++)
|
for (Field **field_ptr= table->field; *field_ptr; field_ptr++)
|
||||||
{
|
{
|
||||||
Field *table_field= *field_ptr;
|
Field *table_field= *field_ptr;
|
||||||
if (!bitmap_is_set(table->read_set, table_field->field_index))
|
if (!table_field->collected_stats)
|
||||||
continue;
|
continue;
|
||||||
restore_record(stat_table, s->default_values);
|
restore_record(stat_table, s->default_values);
|
||||||
column_stat.set_key_fields(table_field);
|
column_stat.set_key_fields(table_field);
|
||||||
@ -3709,6 +3711,7 @@ double get_column_range_cardinality(Field *field,
|
|||||||
if (!table->stats_is_read)
|
if (!table->stats_is_read)
|
||||||
return tab_records;
|
return tab_records;
|
||||||
|
|
||||||
|
THD *thd= table->in_use;
|
||||||
double col_nulls= tab_records * col_stats->get_nulls_ratio();
|
double col_nulls= tab_records * col_stats->get_nulls_ratio();
|
||||||
|
|
||||||
double col_non_nulls= tab_records - col_nulls;
|
double col_non_nulls= tab_records - col_nulls;
|
||||||
@ -3739,7 +3742,7 @@ double get_column_range_cardinality(Field *field,
|
|||||||
col_stats->min_max_values_are_provided())
|
col_stats->min_max_values_are_provided())
|
||||||
{
|
{
|
||||||
Histogram *hist= &col_stats->histogram;
|
Histogram *hist= &col_stats->histogram;
|
||||||
if (hist->is_available())
|
if (hist->is_usable(thd))
|
||||||
{
|
{
|
||||||
store_key_image_to_rec(field, (uchar *) min_endp->key,
|
store_key_image_to_rec(field, (uchar *) min_endp->key,
|
||||||
field->key_length());
|
field->key_length());
|
||||||
@ -3783,10 +3786,10 @@ double get_column_range_cardinality(Field *field,
|
|||||||
max_mp_pos= 1.0;
|
max_mp_pos= 1.0;
|
||||||
|
|
||||||
Histogram *hist= &col_stats->histogram;
|
Histogram *hist= &col_stats->histogram;
|
||||||
if (!hist->is_available())
|
if (hist->is_usable(thd))
|
||||||
sel= (max_mp_pos - min_mp_pos);
|
|
||||||
else
|
|
||||||
sel= hist->range_selectivity(min_mp_pos, max_mp_pos);
|
sel= hist->range_selectivity(min_mp_pos, max_mp_pos);
|
||||||
|
else
|
||||||
|
sel= (max_mp_pos - min_mp_pos);
|
||||||
res= col_non_nulls * sel;
|
res= col_non_nulls * sel;
|
||||||
set_if_bigger(res, col_stats->get_avg_frequency());
|
set_if_bigger(res, col_stats->get_avg_frequency());
|
||||||
}
|
}
|
||||||
|
@ -212,6 +212,17 @@ public:
|
|||||||
|
|
||||||
bool is_available() { return get_size() > 0 && get_values(); }
|
bool is_available() { return get_size() > 0 && get_values(); }
|
||||||
|
|
||||||
|
/*
|
||||||
|
This function checks that histograms should be usable only when
|
||||||
|
1) the level of optimizer_use_condition_selectivity > 3
|
||||||
|
2) histograms have been collected
|
||||||
|
*/
|
||||||
|
bool is_usable(THD *thd)
|
||||||
|
{
|
||||||
|
return thd->variables.optimizer_use_condition_selectivity > 3 &&
|
||||||
|
is_available();
|
||||||
|
}
|
||||||
|
|
||||||
void set_value(uint i, double val)
|
void set_value(uint i, double val)
|
||||||
{
|
{
|
||||||
switch (type) {
|
switch (type) {
|
||||||
|
@ -91,7 +91,7 @@ class engine_option_value;
|
|||||||
struct ha_index_option_struct;
|
struct ha_index_option_struct;
|
||||||
|
|
||||||
typedef struct st_key {
|
typedef struct st_key {
|
||||||
uint key_length; /* Tot length of key */
|
uint key_length; /* total length of user defined key parts */
|
||||||
ulong flags; /* dupp key and pack flags */
|
ulong flags; /* dupp key and pack flags */
|
||||||
uint user_defined_key_parts; /* How many key_parts */
|
uint user_defined_key_parts; /* How many key_parts */
|
||||||
uint usable_key_parts; /* Should normally be = user_defined_key_parts */
|
uint usable_key_parts; /* Should normally be = user_defined_key_parts */
|
||||||
|
10
sql/table.cc
10
sql/table.cc
@ -2383,6 +2383,12 @@ int TABLE_SHARE::init_from_binary_frm_image(THD *thd, bool write,
|
|||||||
key_part->null_bit= field->null_bit;
|
key_part->null_bit= field->null_bit;
|
||||||
key_part->store_length+=HA_KEY_NULL_LENGTH;
|
key_part->store_length+=HA_KEY_NULL_LENGTH;
|
||||||
keyinfo->flags|=HA_NULL_PART_KEY;
|
keyinfo->flags|=HA_NULL_PART_KEY;
|
||||||
|
|
||||||
|
/*
|
||||||
|
This branch is executed only for user defined key parts of the
|
||||||
|
secondary indexes.
|
||||||
|
*/
|
||||||
|
DBUG_ASSERT(i < keyinfo->user_defined_key_parts);
|
||||||
keyinfo->key_length+= HA_KEY_NULL_LENGTH;
|
keyinfo->key_length+= HA_KEY_NULL_LENGTH;
|
||||||
}
|
}
|
||||||
if (field->type() == MYSQL_TYPE_BLOB ||
|
if (field->type() == MYSQL_TYPE_BLOB ||
|
||||||
@ -2395,7 +2401,8 @@ int TABLE_SHARE::init_from_binary_frm_image(THD *thd, bool write,
|
|||||||
else
|
else
|
||||||
key_part->key_part_flag|= HA_VAR_LENGTH_PART;
|
key_part->key_part_flag|= HA_VAR_LENGTH_PART;
|
||||||
key_part->store_length+=HA_KEY_BLOB_LENGTH;
|
key_part->store_length+=HA_KEY_BLOB_LENGTH;
|
||||||
keyinfo->key_length+= HA_KEY_BLOB_LENGTH;
|
if (i < keyinfo->user_defined_key_parts)
|
||||||
|
keyinfo->key_length+= HA_KEY_BLOB_LENGTH;
|
||||||
}
|
}
|
||||||
if (field->type() == MYSQL_TYPE_BIT)
|
if (field->type() == MYSQL_TYPE_BIT)
|
||||||
key_part->key_part_flag|= HA_BIT_PART;
|
key_part->key_part_flag|= HA_BIT_PART;
|
||||||
@ -2488,7 +2495,6 @@ int TABLE_SHARE::init_from_binary_frm_image(THD *thd, bool write,
|
|||||||
|
|
||||||
set_if_bigger(share->max_key_length,keyinfo->key_length+
|
set_if_bigger(share->max_key_length,keyinfo->key_length+
|
||||||
keyinfo->user_defined_key_parts);
|
keyinfo->user_defined_key_parts);
|
||||||
share->total_key_length+= keyinfo->key_length;
|
|
||||||
/*
|
/*
|
||||||
MERGE tables do not have unique indexes. But every key could be
|
MERGE tables do not have unique indexes. But every key could be
|
||||||
an unique index on the underlying MyISAM table. (Bug #10400)
|
an unique index on the underlying MyISAM table. (Bug #10400)
|
||||||
|
@ -788,7 +788,7 @@ struct TABLE_SHARE
|
|||||||
uint rec_buff_length; /* Size of table->record[] buffer */
|
uint rec_buff_length; /* Size of table->record[] buffer */
|
||||||
uint keys, key_parts;
|
uint keys, key_parts;
|
||||||
uint ext_key_parts; /* Total number of key parts in extended keys */
|
uint ext_key_parts; /* Total number of key parts in extended keys */
|
||||||
uint max_key_length, max_unique_length, total_key_length;
|
uint max_key_length, max_unique_length;
|
||||||
uint uniques; /* Number of UNIQUE index */
|
uint uniques; /* Number of UNIQUE index */
|
||||||
uint db_create_options; /* Create options from database */
|
uint db_create_options; /* Create options from database */
|
||||||
uint db_options_in_use; /* Options in use */
|
uint db_options_in_use; /* Options in use */
|
||||||
|
@ -701,8 +701,20 @@ static size_t estimate_cmd_len (bool* extra_args)
|
|||||||
char c;
|
char c;
|
||||||
while ((c = *arg++) != 0)
|
while ((c = *arg++) != 0)
|
||||||
{
|
{
|
||||||
/* A whitespace or a single quote requires double quotation marks: */
|
/*
|
||||||
if (isspace(c) || c == '\'')
|
Space, single quote, ampersand, and I/O redirection characters
|
||||||
|
require text to be enclosed in double quotes:
|
||||||
|
*/
|
||||||
|
if (isspace(c) || c == '\'' || c == '&' || c == '|' ||
|
||||||
|
#ifdef __WIN__
|
||||||
|
c == '>' || c == '<')
|
||||||
|
#else
|
||||||
|
/*
|
||||||
|
The semicolon is used to separate shell commands, so it must be
|
||||||
|
enclosed in double quotes as well:
|
||||||
|
*/
|
||||||
|
c == '>' || c == '<' || c == ';')
|
||||||
|
#endif
|
||||||
{
|
{
|
||||||
quotation= true;
|
quotation= true;
|
||||||
}
|
}
|
||||||
@ -725,10 +737,19 @@ static size_t estimate_cmd_len (bool* extra_args)
|
|||||||
while ((c = *arg++) != 0)
|
while ((c = *arg++) != 0)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
A whitespace or a single quote requires double
|
Space, single quote, ampersand, and I/O redirection characters
|
||||||
quotation marks:
|
require text to be enclosed in double quotes:
|
||||||
*/
|
*/
|
||||||
if (isspace(c) || c == '\'')
|
if (isspace(c) || c == '\'' || c == '&' || c == '|' ||
|
||||||
|
#ifdef __WIN__
|
||||||
|
c == '>' || c == '<')
|
||||||
|
#else
|
||||||
|
/*
|
||||||
|
The semicolon is used to separate shell commands, so it must be
|
||||||
|
enclosed in double quotes as well:
|
||||||
|
*/
|
||||||
|
c == '>' || c == '<' || c == ';')
|
||||||
|
#endif
|
||||||
{
|
{
|
||||||
quotation= true;
|
quotation= true;
|
||||||
}
|
}
|
||||||
@ -809,8 +830,20 @@ static void copy_orig_argv (char* cmd_str)
|
|||||||
char c;
|
char c;
|
||||||
while ((c = *arg_scan++) != 0)
|
while ((c = *arg_scan++) != 0)
|
||||||
{
|
{
|
||||||
/* A whitespace or a single quote requires double quotation marks: */
|
/*
|
||||||
if (isspace(c) || c == '\'')
|
Space, single quote, ampersand, and I/O redirection characters
|
||||||
|
require text to be enclosed in double quotes:
|
||||||
|
*/
|
||||||
|
if (isspace(c) || c == '\'' || c == '&' || c == '|' ||
|
||||||
|
#ifdef __WIN__
|
||||||
|
c == '>' || c == '<')
|
||||||
|
#else
|
||||||
|
/*
|
||||||
|
The semicolon is used to separate shell commands, so it must be
|
||||||
|
enclosed in double quotes as well:
|
||||||
|
*/
|
||||||
|
c == '>' || c == '<' || c == ';')
|
||||||
|
#endif
|
||||||
{
|
{
|
||||||
quotation= true;
|
quotation= true;
|
||||||
}
|
}
|
||||||
@ -884,10 +917,19 @@ static void copy_orig_argv (char* cmd_str)
|
|||||||
while ((c = *arg_scan++) != 0)
|
while ((c = *arg_scan++) != 0)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
A whitespace or a single quote requires double
|
Space, single quote, ampersand, and I/O redirection characters
|
||||||
quotation marks:
|
require text to be enclosed in double quotes:
|
||||||
*/
|
*/
|
||||||
if (isspace(c) || c == '\'')
|
if (isspace(c) || c == '\'' || c == '&' || c == '|' ||
|
||||||
|
#ifdef __WIN__
|
||||||
|
c == '>' || c == '<')
|
||||||
|
#else
|
||||||
|
/*
|
||||||
|
The semicolon is used to separate shell commands, so it must be
|
||||||
|
enclosed in double quotes as well:
|
||||||
|
*/
|
||||||
|
c == '>' || c == '<' || c == ';')
|
||||||
|
#endif
|
||||||
{
|
{
|
||||||
quotation= true;
|
quotation= true;
|
||||||
}
|
}
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
Copyright (c) 1996, 2016, Oracle and/or its affiliates. All Rights Reserved.
|
Copyright (c) 1996, 2016, Oracle and/or its affiliates. All Rights Reserved.
|
||||||
Copyright (c) 2008, Google Inc.
|
Copyright (c) 2008, Google Inc.
|
||||||
Copyright (c) 2017, 2020, MariaDB Corporation.
|
Copyright (c) 2017, 2021, MariaDB Corporation.
|
||||||
|
|
||||||
Portions of this file contain modifications contributed and copyrighted by
|
Portions of this file contain modifications contributed and copyrighted by
|
||||||
Google, Inc. Those modifications are gratefully acknowledged and are described
|
Google, Inc. Those modifications are gratefully acknowledged and are described
|
||||||
@ -673,6 +673,12 @@ btr_search_update_hash_ref(
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (cursor->index != index) {
|
||||||
|
ut_ad(cursor->index->id == index->id);
|
||||||
|
btr_search_drop_page_hash_index(block);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
ut_ad(block->page.id.space() == index->table->space_id);
|
ut_ad(block->page.id.space() == index->table->space_id);
|
||||||
ut_ad(index == cursor->index);
|
ut_ad(index == cursor->index);
|
||||||
ut_ad(!dict_index_is_ibuf(index));
|
ut_ad(!dict_index_is_ibuf(index));
|
||||||
@ -1132,15 +1138,26 @@ retry:
|
|||||||
% btr_ahi_parts;
|
% btr_ahi_parts;
|
||||||
latch = btr_search_latches[ahi_slot];
|
latch = btr_search_latches[ahi_slot];
|
||||||
|
|
||||||
rw_lock_s_lock(latch);
|
dict_index_t* index = block->index;
|
||||||
|
|
||||||
|
bool is_freed = index && index->freed();
|
||||||
|
if (is_freed) {
|
||||||
|
rw_lock_x_lock(latch);
|
||||||
|
} else {
|
||||||
|
rw_lock_s_lock(latch);
|
||||||
|
}
|
||||||
|
|
||||||
assert_block_ahi_valid(block);
|
assert_block_ahi_valid(block);
|
||||||
|
|
||||||
if (!block->index || !btr_search_enabled) {
|
if (!index || !btr_search_enabled) {
|
||||||
rw_lock_s_unlock(latch);
|
if (is_freed) {
|
||||||
|
rw_lock_x_unlock(latch);
|
||||||
|
} else {
|
||||||
|
rw_lock_s_unlock(latch);
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
dict_index_t* index = block->index;
|
|
||||||
#ifdef MYSQL_INDEX_DISABLE_AHI
|
#ifdef MYSQL_INDEX_DISABLE_AHI
|
||||||
ut_ad(!index->disable_ahi);
|
ut_ad(!index->disable_ahi);
|
||||||
#endif
|
#endif
|
||||||
@ -1156,7 +1173,9 @@ retry:
|
|||||||
/* NOTE: The AHI fields of block must not be accessed after
|
/* NOTE: The AHI fields of block must not be accessed after
|
||||||
releasing search latch, as the index page might only be s-latched! */
|
releasing search latch, as the index page might only be s-latched! */
|
||||||
|
|
||||||
rw_lock_s_unlock(latch);
|
if (!is_freed) {
|
||||||
|
rw_lock_s_unlock(latch);
|
||||||
|
}
|
||||||
|
|
||||||
ut_a(n_fields > 0 || n_bytes > 0);
|
ut_a(n_fields > 0 || n_bytes > 0);
|
||||||
|
|
||||||
@ -1207,16 +1226,18 @@ next_rec:
|
|||||||
mem_heap_free(heap);
|
mem_heap_free(heap);
|
||||||
}
|
}
|
||||||
|
|
||||||
rw_lock_x_lock(latch);
|
if (!is_freed) {
|
||||||
|
rw_lock_x_lock(latch);
|
||||||
|
|
||||||
if (UNIV_UNLIKELY(!block->index)) {
|
if (UNIV_UNLIKELY(!block->index)) {
|
||||||
/* Someone else has meanwhile dropped the hash index */
|
/* Someone else has meanwhile dropped the
|
||||||
|
hash index */
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
goto cleanup;
|
ut_a(block->index == index);
|
||||||
}
|
}
|
||||||
|
|
||||||
ut_a(block->index == index);
|
|
||||||
|
|
||||||
if (block->curr_n_fields != n_fields
|
if (block->curr_n_fields != n_fields
|
||||||
|| block->curr_n_bytes != n_bytes) {
|
|| block->curr_n_bytes != n_bytes) {
|
||||||
|
|
||||||
@ -1590,6 +1611,7 @@ btr_search_move_or_delete_hash_entries(
|
|||||||
rw_lock_t* ahi_latch = index ? btr_get_search_latch(index) : NULL;
|
rw_lock_t* ahi_latch = index ? btr_get_search_latch(index) : NULL;
|
||||||
|
|
||||||
if (new_block->index) {
|
if (new_block->index) {
|
||||||
|
drop_exit:
|
||||||
btr_search_drop_page_hash_index(block);
|
btr_search_drop_page_hash_index(block);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -1601,6 +1623,12 @@ btr_search_move_or_delete_hash_entries(
|
|||||||
rw_lock_s_lock(ahi_latch);
|
rw_lock_s_lock(ahi_latch);
|
||||||
|
|
||||||
if (block->index) {
|
if (block->index) {
|
||||||
|
|
||||||
|
if (block->index != index) {
|
||||||
|
rw_lock_s_unlock(ahi_latch);
|
||||||
|
goto drop_exit;
|
||||||
|
}
|
||||||
|
|
||||||
ulint n_fields = block->curr_n_fields;
|
ulint n_fields = block->curr_n_fields;
|
||||||
ulint n_bytes = block->curr_n_bytes;
|
ulint n_bytes = block->curr_n_bytes;
|
||||||
ibool left_side = block->curr_left_side;
|
ibool left_side = block->curr_left_side;
|
||||||
@ -1621,7 +1649,6 @@ btr_search_move_or_delete_hash_entries(
|
|||||||
ut_ad(left_side == block->curr_left_side);
|
ut_ad(left_side == block->curr_left_side);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
rw_lock_s_unlock(ahi_latch);
|
rw_lock_s_unlock(ahi_latch);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1659,6 +1686,12 @@ void btr_search_update_hash_on_delete(btr_cur_t* cursor)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (index != cursor->index) {
|
||||||
|
ut_ad(index->id == cursor->index->id);
|
||||||
|
btr_search_drop_page_hash_index(block);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
ut_ad(block->page.id.space() == index->table->space_id);
|
ut_ad(block->page.id.space() == index->table->space_id);
|
||||||
ut_a(index == cursor->index);
|
ut_a(index == cursor->index);
|
||||||
ut_a(block->curr_n_fields > 0 || block->curr_n_bytes > 0);
|
ut_a(block->curr_n_fields > 0 || block->curr_n_bytes > 0);
|
||||||
@ -1732,6 +1765,12 @@ btr_search_update_hash_node_on_insert(btr_cur_t* cursor, rw_lock_t* ahi_latch)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (cursor->index != index) {
|
||||||
|
ut_ad(cursor->index->id == index->id);
|
||||||
|
btr_search_drop_page_hash_index(block);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
ut_a(cursor->index == index);
|
ut_a(cursor->index == index);
|
||||||
ut_ad(!dict_index_is_ibuf(index));
|
ut_ad(!dict_index_is_ibuf(index));
|
||||||
rw_lock_x_lock(ahi_latch);
|
rw_lock_x_lock(ahi_latch);
|
||||||
@ -1821,6 +1860,12 @@ btr_search_update_hash_on_insert(btr_cur_t* cursor, rw_lock_t* ahi_latch)
|
|||||||
#ifdef MYSQL_INDEX_DISABLE_AHI
|
#ifdef MYSQL_INDEX_DISABLE_AHI
|
||||||
ut_a(!index->disable_ahi);
|
ut_a(!index->disable_ahi);
|
||||||
#endif
|
#endif
|
||||||
|
if (index != cursor->index) {
|
||||||
|
ut_ad(index->id == cursor->index->id);
|
||||||
|
btr_search_drop_page_hash_index(block);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
ut_a(index == cursor->index);
|
ut_a(index == cursor->index);
|
||||||
ut_ad(!dict_index_is_ibuf(index));
|
ut_ad(!dict_index_is_ibuf(index));
|
||||||
|
|
||||||
|
@ -7613,6 +7613,7 @@ innobase_rename_column_try(
|
|||||||
{
|
{
|
||||||
pars_info_t* info;
|
pars_info_t* info;
|
||||||
dberr_t error;
|
dberr_t error;
|
||||||
|
bool clust_has_prefixes = false;
|
||||||
|
|
||||||
DBUG_ENTER("innobase_rename_column_try");
|
DBUG_ENTER("innobase_rename_column_try");
|
||||||
|
|
||||||
@ -7701,6 +7702,39 @@ err_exit:
|
|||||||
if (error != DB_SUCCESS) {
|
if (error != DB_SUCCESS) {
|
||||||
goto err_exit;
|
goto err_exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!has_prefixes || !clust_has_prefixes
|
||||||
|
|| field->prefix_len) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* For secondary indexes, the
|
||||||
|
has_prefixes check can be 'polluted'
|
||||||
|
by PRIMARY KEY column prefix. Try also
|
||||||
|
the simpler encoding of SYS_FIELDS.POS. */
|
||||||
|
info = pars_info_create();
|
||||||
|
|
||||||
|
pars_info_add_ull_literal(info, "indexid", index->id);
|
||||||
|
pars_info_add_int4_literal(info, "nth", i);
|
||||||
|
pars_info_add_str_literal(info, "new", to);
|
||||||
|
|
||||||
|
error = que_eval_sql(
|
||||||
|
info,
|
||||||
|
"PROCEDURE RENAME_SYS_FIELDS_PROC () IS\n"
|
||||||
|
"BEGIN\n"
|
||||||
|
"UPDATE SYS_FIELDS SET COL_NAME=:new\n"
|
||||||
|
"WHERE INDEX_ID=:indexid\n"
|
||||||
|
"AND POS=:nth;\n"
|
||||||
|
"END;\n",
|
||||||
|
FALSE, trx);
|
||||||
|
|
||||||
|
if (error != DB_SUCCESS) {
|
||||||
|
goto err_exit;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (index == dict_table_get_first_index(ctx.old_table)) {
|
||||||
|
clust_has_prefixes = has_prefixes;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -9,7 +9,7 @@ KEY `d` (`d`)
|
|||||||
INSERT INTO t1 VALUES (100, 'aaabbb', UNIX_TIMESTAMP(), 200);
|
INSERT INTO t1 VALUES (100, 'aaabbb', UNIX_TIMESTAMP(), 200);
|
||||||
EXPLAIN SELECT COUNT(*) FROM t1 FORCE INDEX(d);
|
EXPLAIN SELECT COUNT(*) FROM t1 FORCE INDEX(d);
|
||||||
id select_type table type possible_keys key key_len ref rows Extra
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
1 SIMPLE t1 index NULL d 11 NULL # Using index
|
1 SIMPLE t1 index NULL d 9 NULL # Using index
|
||||||
# segfault here without the fix
|
# segfault here without the fix
|
||||||
SELECT COUNT(*) FROM t1 FORCE INDEX(d);
|
SELECT COUNT(*) FROM t1 FORCE INDEX(d);
|
||||||
COUNT(*)
|
COUNT(*)
|
||||||
|
@ -546,7 +546,7 @@ pk key1 col1
|
|||||||
explain
|
explain
|
||||||
select key1 from t30;
|
select key1 from t30;
|
||||||
id select_type table type possible_keys key key_len ref rows Extra
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
1 SIMPLE t30 index NULL key1 20 NULL # Using index
|
1 SIMPLE t30 index NULL key1 18 NULL # Using index
|
||||||
select key1 from t30;
|
select key1 from t30;
|
||||||
key1
|
key1
|
||||||
row1-key
|
row1-key
|
||||||
@ -618,7 +618,7 @@ row3 row3-key row3-data
|
|||||||
explain
|
explain
|
||||||
select * from t30 order by key1 limit 3;
|
select * from t30 order by key1 limit 3;
|
||||||
id select_type table type possible_keys key key_len ref rows Extra
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
1 SIMPLE t30 index NULL key1 20 NULL #
|
1 SIMPLE t30 index NULL key1 18 NULL #
|
||||||
select * from t30 order by key1 limit 3;
|
select * from t30 order by key1 limit 3;
|
||||||
pk key1 col1
|
pk key1 col1
|
||||||
row1 row1-key row1-data
|
row1 row1-key row1-data
|
||||||
@ -627,7 +627,7 @@ row3 row3-key row3-data
|
|||||||
explain
|
explain
|
||||||
select * from t30 order by key1 desc limit 3;
|
select * from t30 order by key1 desc limit 3;
|
||||||
id select_type table type possible_keys key key_len ref rows Extra
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
1 SIMPLE t30 index NULL key1 20 NULL #
|
1 SIMPLE t30 index NULL key1 18 NULL #
|
||||||
select * from t30 order by key1 desc limit 3;
|
select * from t30 order by key1 desc limit 3;
|
||||||
pk key1 col1
|
pk key1 col1
|
||||||
row5 row5-key row5-data
|
row5 row5-key row5-data
|
||||||
|
@ -45,7 +45,7 @@ t1 1 v16 1 v16 A 500 NULL NULL YES LSMTREE
|
|||||||
INSERT INTO t1 (c,c20,v16,v128,pk) VALUES ('a','char1','varchar1a','varchar1b','1'),('a','char2','varchar2a','varchar2b','2'),('b','char3','varchar1a','varchar1b','3'),('c','char4','varchar3a','varchar3b','4');
|
INSERT INTO t1 (c,c20,v16,v128,pk) VALUES ('a','char1','varchar1a','varchar1b','1'),('a','char2','varchar2a','varchar2b','2'),('b','char3','varchar1a','varchar1b','3'),('c','char4','varchar3a','varchar3b','4');
|
||||||
EXPLAIN SELECT SUBSTRING(v16,0,3) FROM t1 WHERE v16 LIKE 'varchar%';
|
EXPLAIN SELECT SUBSTRING(v16,0,3) FROM t1 WHERE v16 LIKE 'varchar%';
|
||||||
id select_type table type possible_keys key key_len ref rows Extra
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
1 SIMPLE t1 index v16 v16 21 NULL # Using where; Using index
|
1 SIMPLE t1 index v16 v16 19 NULL # Using where; Using index
|
||||||
SELECT SUBSTRING(v16,7,3) FROM t1 WHERE v16 LIKE 'varchar%';
|
SELECT SUBSTRING(v16,7,3) FROM t1 WHERE v16 LIKE 'varchar%';
|
||||||
SUBSTRING(v16,7,3)
|
SUBSTRING(v16,7,3)
|
||||||
r1a
|
r1a
|
||||||
|
@ -177,9 +177,8 @@ Note 1265 Data truncated for column 'a' at row 2
|
|||||||
insert into t1 values ("1e+18446744073709551615"),("1e+18446744073709551616"),("1e-9223372036854775807"),("1e-9223372036854775809");
|
insert into t1 values ("1e+18446744073709551615"),("1e+18446744073709551616"),("1e-9223372036854775807"),("1e-9223372036854775809");
|
||||||
Warnings:
|
Warnings:
|
||||||
Warning 1264 Out of range value for column 'a' at row 1
|
Warning 1264 Out of range value for column 'a' at row 1
|
||||||
Warning 1366 Incorrect decimal value: '1e+18446744073709551616' for column `test`.`t1`.`a` at row 2
|
Warning 1264 Out of range value for column 'a' at row 2
|
||||||
Note 1265 Data truncated for column 'a' at row 3
|
Note 1265 Data truncated for column 'a' at row 3
|
||||||
Warning 1366 Incorrect decimal value: '1e-9223372036854775809' for column `test`.`t1`.`a` at row 4
|
|
||||||
insert into t1 values ("123.4e"),("123.4e+2"),("123.4e-2"),("123e1"),("123e+0");
|
insert into t1 values ("123.4e"),("123.4e+2"),("123.4e-2"),("123e1"),("123e+0");
|
||||||
Warnings:
|
Warnings:
|
||||||
Warning 1265 Data truncated for column 'a' at row 1
|
Warning 1265 Data truncated for column 'a' at row 1
|
||||||
@ -210,7 +209,7 @@ a
|
|||||||
99999999.99
|
99999999.99
|
||||||
0.00
|
0.00
|
||||||
99999999.99
|
99999999.99
|
||||||
0.00
|
99999999.99
|
||||||
0.00
|
0.00
|
||||||
0.00
|
0.00
|
||||||
123.40
|
123.40
|
||||||
|
@ -921,20 +921,75 @@ internal_str2dec(const char *from, decimal_t *to, char **end, my_bool fixed)
|
|||||||
if (endp+1 < end_of_string && (*endp == 'e' || *endp == 'E'))
|
if (endp+1 < end_of_string && (*endp == 'e' || *endp == 'E'))
|
||||||
{
|
{
|
||||||
int str_error;
|
int str_error;
|
||||||
longlong exponent= my_strtoll10(endp+1, (char**) &end_of_string,
|
const char *end_of_exponent= end_of_string;
|
||||||
|
longlong exponent= my_strtoll10(endp+1, (char**) &end_of_exponent,
|
||||||
&str_error);
|
&str_error);
|
||||||
|
|
||||||
if (end_of_string != endp +1) /* If at least one digit */
|
if (end_of_exponent != endp +1) /* If at least one digit */
|
||||||
{
|
{
|
||||||
*end= (char*) end_of_string;
|
*end= (char*) end_of_exponent;
|
||||||
if (str_error > 0)
|
if (str_error > 0)
|
||||||
{
|
{
|
||||||
|
if (str_error == MY_ERRNO_ERANGE)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
Exponent is:
|
||||||
|
- a huge positive number that does not fit into ulonglong
|
||||||
|
- a huge negative number that does not fit into longlong
|
||||||
|
Skip all remaining digits.
|
||||||
|
*/
|
||||||
|
for ( ; end_of_exponent < end_of_string &&
|
||||||
|
my_isdigit(&my_charset_latin1, *end_of_exponent)
|
||||||
|
; end_of_exponent++)
|
||||||
|
{ }
|
||||||
|
*end= (char*) end_of_exponent;
|
||||||
|
if (exponent == ~0)
|
||||||
|
{
|
||||||
|
if (!decimal_is_zero(to))
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
Non-zero mantissa and a huge positive exponent that
|
||||||
|
does not fit into ulonglong, e.g.:
|
||||||
|
1e111111111111111111111
|
||||||
|
*/
|
||||||
|
error= E_DEC_OVERFLOW;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
Zero mantissa and a huge positive exponent that
|
||||||
|
does not fit into ulonglong, e.g.:
|
||||||
|
0e111111111111111111111
|
||||||
|
Return zero without warnings.
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
Huge negative exponent that does not fit into longlong, e.g.
|
||||||
|
1e-111111111111111111111
|
||||||
|
0e-111111111111111111111
|
||||||
|
Return zero without warnings.
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
goto fatal_error;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Some other error, e.g. MY_ERRNO_EDOM
|
||||||
|
*/
|
||||||
error= E_DEC_BAD_NUM;
|
error= E_DEC_BAD_NUM;
|
||||||
goto fatal_error;
|
goto fatal_error;
|
||||||
}
|
}
|
||||||
if (exponent > INT_MAX/2 || (str_error == 0 && exponent < 0))
|
if (exponent > INT_MAX/2 || (str_error == 0 && exponent < 0))
|
||||||
{
|
{
|
||||||
error= E_DEC_OVERFLOW;
|
/*
|
||||||
|
The exponent fits into ulonglong, but it's still huge, e.g.
|
||||||
|
1e1111111111
|
||||||
|
*/
|
||||||
|
if (!decimal_is_zero(to))
|
||||||
|
error= E_DEC_OVERFLOW;
|
||||||
goto fatal_error;
|
goto fatal_error;
|
||||||
}
|
}
|
||||||
if (exponent < INT_MIN/2 && error != E_DEC_OVERFLOW)
|
if (exponent < INT_MIN/2 && error != E_DEC_OVERFLOW)
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
SET(HEIDISQL_BASE_NAME "HeidiSQL_11.0_32_Portable")
|
SET(HEIDISQL_BASE_NAME "HeidiSQL_11.2_32_Portable")
|
||||||
SET(HEIDISQL_ZIP "${HEIDISQL_BASE_NAME}.zip")
|
SET(HEIDISQL_ZIP "${HEIDISQL_BASE_NAME}.zip")
|
||||||
SET(HEIDISQL_URL "http://www.heidisql.com/downloads/releases/${HEIDISQL_ZIP}")
|
SET(HEIDISQL_URL "http://www.heidisql.com/downloads/releases/${HEIDISQL_ZIP}")
|
||||||
SET(HEIDISQL_DOWNLOAD_DIR ${THIRD_PARTY_DOWNLOAD_LOCATION}/${HEIDISQL_BASE_NAME})
|
SET(HEIDISQL_DOWNLOAD_DIR ${THIRD_PARTY_DOWNLOAD_LOCATION}/${HEIDISQL_BASE_NAME})
|
||||||
|
Loading…
x
Reference in New Issue
Block a user