Commit ccaec18b authored by Marko Mäkelä's avatar Marko Mäkelä

Merge 10.1 into 10.2

parents e40ed0e8 26f0cd8a
# Copyright (c) 2010, 2014, Oracle and/or its affiliates. All rights reserved. # Copyright (c) 2010, 2014, Oracle and/or its affiliates. All rights reserved.
# Copyright (c) 2020, MariaDB
# #
# This program is free software; you can redistribute it and/or modify # This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by # it under the terms of the GNU General Public License as published by
...@@ -28,11 +29,16 @@ SET(MY_WARNING_FLAGS ...@@ -28,11 +29,16 @@ SET(MY_WARNING_FLAGS
-Woverloaded-virtual -Woverloaded-virtual
-Wvla -Wvla
-Wwrite-strings -Wwrite-strings
-Werror
) )
FOREACH(F ${MY_WARNING_FLAGS})
MY_CHECK_AND_SET_COMPILER_FLAG(${F} DEBUG RELWITHDEBINFO)
ENDFOREACH()
SET(MY_ERROR_FLAGS -Werror)
IF(CMAKE_COMPILER_IS_GNUCC AND CMAKE_C_COMPILER_VERSION VERSION_LESS "6.0.0") IF(CMAKE_COMPILER_IS_GNUCC AND CMAKE_C_COMPILER_VERSION VERSION_LESS "6.0.0")
SET(MY_WARNING_FLAGS ${MY_WARNING_FLAGS} -Wno-error=maybe-uninitialized) SET(MY_ERROR_FLAGS ${MY_ERROR_FLAGS} -Wno-error=maybe-uninitialized)
ENDIF() ENDIF()
IF(MYSQL_MAINTAINER_MODE MATCHES "OFF") IF(MYSQL_MAINTAINER_MODE MATCHES "OFF")
...@@ -41,7 +47,7 @@ ELSEIF(MYSQL_MAINTAINER_MODE MATCHES "AUTO") ...@@ -41,7 +47,7 @@ ELSEIF(MYSQL_MAINTAINER_MODE MATCHES "AUTO")
SET(WHERE DEBUG) SET(WHERE DEBUG)
ENDIF() ENDIF()
FOREACH(F ${MY_WARNING_FLAGS}) FOREACH(F ${MY_ERROR_FLAGS})
MY_CHECK_AND_SET_COMPILER_FLAG(${F} ${WHERE}) MY_CHECK_AND_SET_COMPILER_FLAG(${F} ${WHERE})
ENDFOREACH() ENDFOREACH()
......
...@@ -20,7 +20,9 @@ ...@@ -20,7 +20,9 @@
# same name. # same name.
package mtr_report; package mtr_report;
use strict; use strict;
use Sys::Hostname;
use base qw(Exporter); use base qw(Exporter);
our @EXPORT= qw(report_option mtr_print_line mtr_print_thick_line our @EXPORT= qw(report_option mtr_print_line mtr_print_thick_line
...@@ -253,6 +255,7 @@ sub mtr_report_stats ($$$$) { ...@@ -253,6 +255,7 @@ sub mtr_report_stats ($$$$) {
# Find out how we where doing # Find out how we where doing
# ---------------------------------------------------------------------- # ----------------------------------------------------------------------
my $tot_disabled = 0;
my $tot_skipped= 0; my $tot_skipped= 0;
my $tot_skipdetect= 0; my $tot_skipdetect= 0;
my $tot_passed= 0; my $tot_passed= 0;
...@@ -273,6 +276,7 @@ sub mtr_report_stats ($$$$) { ...@@ -273,6 +276,7 @@ sub mtr_report_stats ($$$$) {
{ {
# Test was skipped (disabled not counted) # Test was skipped (disabled not counted)
$tot_skipped++ unless $tinfo->{'disable'}; $tot_skipped++ unless $tinfo->{'disable'};
$tot_disabled++ if $tinfo->{'disable'};
$tot_skipdetect++ if $tinfo->{'skip_detected_by_test'}; $tot_skipdetect++ if $tinfo->{'skip_detected_by_test'};
} }
elsif ( $tinfo->{'result'} eq 'MTR_RES_PASSED' ) elsif ( $tinfo->{'result'} eq 'MTR_RES_PASSED' )
...@@ -402,6 +406,92 @@ sub mtr_report_stats ($$$$) { ...@@ -402,6 +406,92 @@ sub mtr_report_stats ($$$$) {
print "All $tot_tests tests were successful.\n\n"; print "All $tot_tests tests were successful.\n\n";
} }
if ($::opt_xml_report) {
my $xml_report = "";
my @sorted_tests = sort {$a->{'name'} cmp $b->{'name'}} @$tests;
my $last_suite = "";
my $current_suite = "";
my $timest = isotime(time);
my %suite_totals;
my %suite_time;
my %suite_tests;
my %suite_failed;
my %suite_disabled;
my %suite_skipped;
my $host = hostname;
my $suiteNo = 0;
# loop through test results to count totals
foreach my $test ( @sorted_tests ) {
$current_suite = $test->{'suite'}->{'name'};
if ($test->{'timer'} eq "") {
$test->{'timer'} = 0;
}
$suite_time{$current_suite} = $suite_time{$current_suite} + $test->{'timer'};
$suite_tests{$current_suite} = $suite_tests{$current_suite} + 1;
if ($test->{'result'} eq "MTR_RES_FAILED") {
$suite_failed{$current_suite} = $suite_failed{$current_suite} + 1;
} elsif ($test->{'result'} eq "MTR_RES_SKIPPED" && $test->{'disable'}) {
$suite_disabled{$current_suite} = $suite_disabled{$current_suite} + 1;
} elsif ($test->{'result'} eq "MTR_RES_SKIPPED") {
$suite_skipped{$current_suite} = $suite_skipped{$current_suite} + 1;
}
$suite_totals{"all_time"} = $suite_totals{"all_time"} + $test->{'timer'};
}
my $all_time = sprintf("%.3f", $suite_totals{"all_time"} / 1000);
my $suite_time = 0;
my $test_time = 0;
# generate xml
$xml_report = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
$xml_report .= qq(<testsuites disabled="$tot_disabled" errors="" failures="$tot_failed" name="" tests="$tot_tests" time="$all_time">\n);
foreach my $test ( @sorted_tests ) {
$current_suite = $test->{'suite'}->{'name'};
if ($current_suite ne $last_suite) {
if ($last_suite ne "") {
$xml_report .= "\t</testsuite>\n";
$suiteNo++;
}
$suite_time = sprintf("%.3f", $suite_time{$current_suite} / 1000);
$xml_report .= qq(\t<testsuite disabled="$suite_disabled{$current_suite}" errors="" failures="$suite_failed{$current_suite}" hostname="$host" id="$suiteNo" name="$current_suite" package="" skipped="$suite_skipped{$current_suite}" tests="$suite_tests{$current_suite}" time="$suite_time" timestamp="$timest">\n);
$last_suite = $current_suite;
}
$test_time = sprintf("%.3f", $test->{timer} / 1000);
$xml_report .= qq(\t\t<testcase assertions="" classname="$current_suite" name="$test->{'name'}" status="$test->{'result'}" time="$test_time");
my $comment = $test->{'comment'};
$comment =~ s/[\"]//g;
if ($test->{'result'} eq "MTR_RES_FAILED") {
$xml_report .= qq(>\n\t\t\t<failure message="" type="$test->{'result'}">\n<![CDATA[$test->{'logfile'}]]>\n\t\t\t</failure>\n\t\t</testcase>\n);
} elsif ($test->{'result'} eq "MTR_RES_SKIPPED" && $test->{'disable'}) {
$xml_report .= qq(>\n\t\t\t<disabled message="$comment" type="$test->{'result'}"/>\n\t\t</testcase>\n);
} elsif ($test->{'result'} eq "MTR_RES_SKIPPED") {
$xml_report .= qq(>\n\t\t\t<skipped message="$comment" type="$test->{'result'}"/>\n\t\t</testcase>\n);
} else {
$xml_report .= " />\n";
}
}
$xml_report .= "\t</testsuite>\n</testsuites>\n";
# save to file
my $xml_file = $::opt_xml_report;
open XML_FILE, ">", $xml_file or die "Cannot create file $xml_file: $!";
print XML_FILE $xml_report;
close XML_FILE;
}
if (@$extra_warnings) if (@$extra_warnings)
{ {
print <<MSG; print <<MSG;
......
...@@ -128,6 +128,8 @@ our $path_testlog; ...@@ -128,6 +128,8 @@ our $path_testlog;
our $default_vardir; our $default_vardir;
our $opt_vardir; # Path to use for var/ dir our $opt_vardir; # Path to use for var/ dir
our $plugindir; our $plugindir;
our $opt_xml_report; # XML output
my $path_vardir_trace; # unix formatted opt_vardir for trace files my $path_vardir_trace; # unix formatted opt_vardir for trace files
my $opt_tmpdir; # Path to use for tmp/ dir my $opt_tmpdir; # Path to use for tmp/ dir
my $opt_tmpdir_pid; my $opt_tmpdir_pid;
...@@ -730,7 +732,6 @@ sub main { ...@@ -730,7 +732,6 @@ sub main {
mtr_print_line(); mtr_print_line();
print_total_times($opt_parallel) if $opt_report_times; print_total_times($opt_parallel) if $opt_report_times;
mtr_report_stats($prefix, $fail, $completed, $extra_warnings); mtr_report_stats($prefix, $fail, $completed, $extra_warnings);
if ($opt_gcov) { if ($opt_gcov) {
...@@ -1233,6 +1234,7 @@ sub print_global_resfile { ...@@ -1233,6 +1234,7 @@ sub print_global_resfile {
resfile_global("warnings", $opt_warnings ? 1 : 0); resfile_global("warnings", $opt_warnings ? 1 : 0);
resfile_global("max-connections", $opt_max_connections); resfile_global("max-connections", $opt_max_connections);
resfile_global("product", "MySQL"); resfile_global("product", "MySQL");
resfile_global("xml-report", $opt_xml_report);
# Somewhat hacky code to convert numeric version back to dot notation # Somewhat hacky code to convert numeric version back to dot notation
my $v1= int($mysql_version_id / 10000); my $v1= int($mysql_version_id / 10000);
my $v2= int(($mysql_version_id % 10000)/100); my $v2= int(($mysql_version_id % 10000)/100);
...@@ -1398,7 +1400,8 @@ sub command_line_setup { ...@@ -1398,7 +1400,8 @@ sub command_line_setup {
'help|h' => \$opt_usage, 'help|h' => \$opt_usage,
# list-options is internal, not listed in help # list-options is internal, not listed in help
'list-options' => \$opt_list_options, 'list-options' => \$opt_list_options,
'skip-test-list=s' => \@opt_skip_test_list 'skip-test-list=s' => \@opt_skip_test_list,
'xml-report=s' => \$opt_xml_report
); );
# fix options (that take an optional argument and *only* after = sign # fix options (that take an optional argument and *only* after = sign
...@@ -6603,6 +6606,7 @@ Misc options ...@@ -6603,6 +6606,7 @@ Misc options
phases of test execution. phases of test execution.
stress=ARGS Run stress test, providing options to stress=ARGS Run stress test, providing options to
mysql-stress-test.pl. Options are separated by comma. mysql-stress-test.pl. Options are separated by comma.
xml-report=<file> Output jUnit xml file of the results.
Some options that control enabling a feature for normal test runs, Some options that control enabling a feature for normal test runs,
can be turned off by prepending 'no' to the option, e.g. --notimer. can be turned off by prepending 'no' to the option, e.g. --notimer.
......
...@@ -1688,6 +1688,58 @@ id select_type table type possible_keys key key_len ref rows Extra ...@@ -1688,6 +1688,58 @@ id select_type table type possible_keys key key_len ref rows Extra
DROP TABLE t1; DROP TABLE t1;
set optimizer_switch= @optimizer_switch_save; set optimizer_switch= @optimizer_switch_save;
# #
# MDEV-21932: ROR union with index_merge_sort_union=off
#
create table t0 (a int);
insert into t0 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
insert into t0 select a+10 from t0;
insert into t0 select a+20 from t0;
insert into t0 select a+40 from t0;
insert into t0 select a+80 from t0;
insert into t0 select a+160 from t0;
delete from t0 where a > 300;
create table t1 (
f1 int, f2 int, f3 int, f4 int,
primary key (f1), key (f3), key(f4)
) engine=myisam;
insert into t1 select a+100, a+100, a+100, a+100 from t0;
insert into t1 VALUES (9,0,2,6), (9930,0,0,NULL);
analyze table t1;
Table Op Msg_type Msg_text
test.t1 analyze status OK
set optimizer_switch='index_merge_sort_union=off';
set optimizer_switch='index_merge_union=on';
explain select * from t1
where (( f3 = 1 or f1 = 7 ) and f1 < 10) or
(f3 between 2 and 2 and ( f3 = 1 or f4 < 7 ));
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 index_merge PRIMARY,f3,f4 f3,PRIMARY,f3 5,4,5 NULL 3 Using union(f3,PRIMARY,f3); Using where
select * from t1
where (( f3 = 1 or f1 = 7 ) and f1 < 10) or
(f3 between 2 and 2 and ( f3 = 1 or f4 < 7 ));
f1 f2 f3 f4
9 0 2 6
insert into t1 values (52,0,1,0),(53,0,1,0);
insert into t1 values (50,0,1,0),(51,0,1,0);
insert into t1 values (48,0,1,0),(49,0,1,0);
insert into t1 values (46,0,1,0),(47,0,1,0);
insert into t1 values (44,0,1,0),(45,0,1,0);
analyze table t1;
Table Op Msg_type Msg_text
test.t1 analyze status OK
explain select * from t1
where (( f3 = 1 or f1 = 7 ) and f1 < 10) or
(f3 between 2 and 2 and ( f3 = 1 or f4 < 7 ));
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 index_merge PRIMARY,f3,f4 f3,PRIMARY,f3 5,4,5 NULL 13 Using union(f3,PRIMARY,f3); Using where
select * from t1
where (( f3 = 1 or f1 = 7 ) and f1 < 10) or
(f3 between 2 and 2 and ( f3 = 1 or f4 < 7 ));
f1 f2 f3 f4
9 0 2 6
drop table t0,t1;
set optimizer_switch= @optimizer_switch_save;
#
# MDEV-16695: Estimate for rows of derived tables is very high when we are using index_merge union # MDEV-16695: Estimate for rows of derived tables is very high when we are using index_merge union
# #
create table t0 create table t0
...@@ -1722,3 +1774,4 @@ key1 key2 key3 key8 ...@@ -1722,3 +1774,4 @@ key1 key2 key3 key8
3 3 3 1021 3 3 3 1021
set @@optimizer_switch= @optimizer_switch_save; set @@optimizer_switch= @optimizer_switch_save;
drop table t0; drop table t0;
# End of 10.1 tests
...@@ -3756,7 +3756,7 @@ DROP TABLE t1; ...@@ -3756,7 +3756,7 @@ DROP TABLE t1;
# #
CREATE TABLE t1(a int); CREATE TABLE t1(a int);
INSERT INTO t1 VALUES (1), (2); INSERT INTO t1 VALUES (1), (2);
mysqldump: Input filename too long: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa mysqldump: Input filename too long: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...
DROP TABLE t1; DROP TABLE t1;
CREATE TABLE t2 (a INT) ENGINE=MyISAM; CREATE TABLE t2 (a INT) ENGINE=MyISAM;
CREATE TABLE t3 (a INT) ENGINE=MyISAM; CREATE TABLE t3 (a INT) ENGINE=MyISAM;
......
...@@ -2136,6 +2136,26 @@ value1 1003560 12345 ...@@ -2136,6 +2136,26 @@ value1 1003560 12345
value1 1004807 12345 value1 1004807 12345
drop table t1; drop table t1;
# #
# MDEV-22191: Range access is not picked when index_merge_sort_union is turned off
#
set @save_optimizer_switch=@@optimizer_switch;
set @save_optimizer_switch="index_merge_sort_union=OFF";
CREATE TABLE t1 (a INT, INDEX(a));
INSERT INTO t1 VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
explain
SELECT * FROM t1 WHERE a > 5;
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 range a a 5 NULL 5 Using where; Using index
SELECT * FROM t1 WHERE a > 5;
a
6
7
8
9
set @@optimizer_switch=@save_optimizer_switch;
drop table t1;
# End of 5.5 tests
#
# BUG#13731380: RANGE OPTIMIZER CALLS RECORDS_IN_RANGE() FOR OPEN RANGE # BUG#13731380: RANGE OPTIMIZER CALLS RECORDS_IN_RANGE() FOR OPEN RANGE
# #
CREATE TABLE t1 (pk INT PRIMARY KEY); CREATE TABLE t1 (pk INT PRIMARY KEY);
......
...@@ -37,6 +37,33 @@ id select_type table type possible_keys key key_len ref rows Extra ...@@ -37,6 +37,33 @@ id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t0 ALL NULL NULL NULL NULL 10 1 SIMPLE t0 ALL NULL NULL NULL NULL 10
1 SIMPLE t2 range a,b b 5 NULL 201 Using where; Using join buffer (flat, BNL join) 1 SIMPLE t2 range a,b b 5 NULL 201 Using where; Using join buffer (flat, BNL join)
drop table t0,t1,t2; drop table t0,t1,t2;
#
# MDEV-10466: constructing an invalid SEL_ARG
#
create table t1 (
pk int, a int, b int,
primary key (pk), index idx1(b), index idx2(b)
) engine=innodb;
Warnings:
Note 1831 Duplicate index `idx2`. This is deprecated and will be disallowed in a future release
insert into t1 values (1,6,0),(2,1,0),(3,5,2),(4,8,0);
create table t2 (c int) engine=innodb;
insert into t2 values (1),(2);
create table t3 (d int) engine=innodb;
insert into t3 values (3),(-1),(4);
set @save_optimizer_switch=@@optimizer_switch;
set optimizer_switch='extended_keys=on';
explain
select pk, a, b from t1,t2,t3 where b >= d and pk < c and b = '0';
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t2 ALL NULL NULL NULL NULL 2
1 SIMPLE t3 ALL NULL NULL NULL NULL 3 Using join buffer (flat, BNL join)
1 SIMPLE t1 ALL PRIMARY,idx1,idx2 NULL NULL NULL 4 Using where; Using join buffer (incremental, BNL join)
select pk, a, b from t1,t2,t3 where b >= d and pk < c and b = '0';
pk a b
1 6 0
set optimizer_switch=@save_optimizer_switch;
drop table t1,t2,t3;
CREATE TABLE t1 ( CREATE TABLE t1 (
pk INT PRIMARY KEY, f1 INT, f2 CHAR(1), f3 CHAR(1), pk INT PRIMARY KEY, f1 INT, f2 CHAR(1), f3 CHAR(1),
KEY(f1), KEY(f2) KEY(f1), KEY(f2)
...@@ -80,3 +107,4 @@ ERROR HY000: Table definition has changed, please retry transaction ...@@ -80,3 +107,4 @@ ERROR HY000: Table definition has changed, please retry transaction
DROP TABLE t0,t1; DROP TABLE t0,t1;
SET @@GLOBAL.debug_dbug = @saved_dbug; SET @@GLOBAL.debug_dbug = @saved_dbug;
set @@optimizer_switch= @optimizer_switch_save; set @@optimizer_switch= @optimizer_switch_save;
# End of 10.1 tests
...@@ -2138,6 +2138,26 @@ value1 1003560 12345 ...@@ -2138,6 +2138,26 @@ value1 1003560 12345
value1 1004807 12345 value1 1004807 12345
drop table t1; drop table t1;
# #
# MDEV-22191: Range access is not picked when index_merge_sort_union is turned off
#
set @save_optimizer_switch=@@optimizer_switch;
set @save_optimizer_switch="index_merge_sort_union=OFF";
CREATE TABLE t1 (a INT, INDEX(a));
INSERT INTO t1 VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
explain
SELECT * FROM t1 WHERE a > 5;
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 range a a 5 NULL 5 Using where; Using index
SELECT * FROM t1 WHERE a > 5;
a
6
7
8
9
set @@optimizer_switch=@save_optimizer_switch;
drop table t1;
# End of 5.5 tests
#
# BUG#13731380: RANGE OPTIMIZER CALLS RECORDS_IN_RANGE() FOR OPEN RANGE # BUG#13731380: RANGE OPTIMIZER CALLS RECORDS_IN_RANGE() FOR OPEN RANGE
# #
CREATE TABLE t1 (pk INT PRIMARY KEY); CREATE TABLE t1 (pk INT PRIMARY KEY);
......
...@@ -1659,7 +1659,7 @@ SELECT * FROM t1 FORCE KEY (PRIMARY,f3,f4) ...@@ -1659,7 +1659,7 @@ SELECT * FROM t1 FORCE KEY (PRIMARY,f3,f4)
WHERE ( f3 = 1 OR f1 = 7 ) AND f1 < 10 WHERE ( f3 = 1 OR f1 = 7 ) AND f1 < 10
OR f3 BETWEEN 2 AND 2 AND ( f3 = 1 OR f4 != 1 ); OR f3 BETWEEN 2 AND 2 AND ( f3 = 1 OR f4 != 1 );
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 ALL PRIMARY,f3,f4 NULL NULL NULL 2 Using where 1 SIMPLE t1 index_merge PRIMARY,f3,f4 f3,PRIMARY,f3 5,4,5 NULL 3 Using union(f3,PRIMARY,f3); Using where
SELECT * FROM t1 FORCE KEY (PRIMARY,f3,f4) SELECT * FROM t1 FORCE KEY (PRIMARY,f3,f4)
WHERE ( f3 = 1 OR f1 = 7 ) AND f1 < 10 WHERE ( f3 = 1 OR f1 = 7 ) AND f1 < 10
OR f3 BETWEEN 2 AND 2 AND ( f3 = 1 OR f4 != 1 ); OR f3 BETWEEN 2 AND 2 AND ( f3 = 1 OR f4 != 1 );
......
...@@ -243,6 +243,55 @@ DROP TABLE t1; ...@@ -243,6 +243,55 @@ DROP TABLE t1;
set optimizer_switch= @optimizer_switch_save; set optimizer_switch= @optimizer_switch_save;
--echo #
--echo # MDEV-21932: ROR union with index_merge_sort_union=off
--echo #
create table t0 (a int);
insert into t0 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
insert into t0 select a+10 from t0;
insert into t0 select a+20 from t0;
insert into t0 select a+40 from t0;
insert into t0 select a+80 from t0;
insert into t0 select a+160 from t0;
delete from t0 where a > 300;
create table t1 (
f1 int, f2 int, f3 int, f4 int,
primary key (f1), key (f3), key(f4)
) engine=myisam;
insert into t1 select a+100, a+100, a+100, a+100 from t0;
insert into t1 VALUES (9,0,2,6), (9930,0,0,NULL);
analyze table t1;
set optimizer_switch='index_merge_sort_union=off';
set optimizer_switch='index_merge_union=on';
let $q1=
select * from t1
where (( f3 = 1 or f1 = 7 ) and f1 < 10) or
(f3 between 2 and 2 and ( f3 = 1 or f4 < 7 ));
eval explain $q1;
eval $q1;
insert into t1 values (52,0,1,0),(53,0,1,0);
insert into t1 values (50,0,1,0),(51,0,1,0);
insert into t1 values (48,0,1,0),(49,0,1,0);
insert into t1 values (46,0,1,0),(47,0,1,0);
insert into t1 values (44,0,1,0),(45,0,1,0);
analyze table t1;
let $q2=
select * from t1
where (( f3 = 1 or f1 = 7 ) and f1 < 10) or
(f3 between 2 and 2 and ( f3 = 1 or f4 < 7 ));
eval explain $q2;
eval $q2;
drop table t0,t1;
set optimizer_switch= @optimizer_switch_save;
--echo # --echo #
--echo # MDEV-16695: Estimate for rows of derived tables is very high when we are using index_merge union --echo # MDEV-16695: Estimate for rows of derived tables is very high when we are using index_merge union
--echo # --echo #
...@@ -270,3 +319,5 @@ explain select * from (select * from t0 where key1 = 3 or key2 =3) as Z where Z. ...@@ -270,3 +319,5 @@ explain select * from (select * from t0 where key1 = 3 or key2 =3) as Z where Z.
select * from (select * from t0 where key1 = 3 or key2 =3) as Z where Z.key8 > 5; select * from (select * from t0 where key1 = 3 or key2 =3) as Z where Z.key8 > 5;
set @@optimizer_switch= @optimizer_switch_save; set @@optimizer_switch= @optimizer_switch_save;
drop table t0; drop table t0;
--echo # End of 10.1 tests
...@@ -1720,6 +1720,22 @@ where (key1varchar='value1' AND (key2int <=1 OR key2int > 1)); ...@@ -1720,6 +1720,22 @@ where (key1varchar='value1' AND (key2int <=1 OR key2int > 1));
select * from t1; select * from t1;
drop table t1; drop table t1;
--echo #
--echo # MDEV-22191: Range access is not picked when index_merge_sort_union is turned off
--echo #
set @save_optimizer_switch=@@optimizer_switch;
set @save_optimizer_switch="index_merge_sort_union=OFF";
CREATE TABLE t1 (a INT, INDEX(a));
INSERT INTO t1 VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
explain
SELECT * FROM t1 WHERE a > 5;
SELECT * FROM t1 WHERE a > 5;
set @@optimizer_switch=@save_optimizer_switch;
drop table t1;
--echo # End of 5.5 tests
--echo # --echo #
--echo # BUG#13731380: RANGE OPTIMIZER CALLS RECORDS_IN_RANGE() FOR OPEN RANGE --echo # BUG#13731380: RANGE OPTIMIZER CALLS RECORDS_IN_RANGE() FOR OPEN RANGE
--echo # --echo #
......
...@@ -46,6 +46,32 @@ explain select * from t0 left join t2 on t2.a <t0.a and t2.b between 50 and 250; ...@@ -46,6 +46,32 @@ explain select * from t0 left join t2 on t2.a <t0.a and t2.b between 50 and 250;
drop table t0,t1,t2; drop table t0,t1,t2;
--echo #
--echo # MDEV-10466: constructing an invalid SEL_ARG
--echo #
create table t1 (
pk int, a int, b int,
primary key (pk), index idx1(b), index idx2(b)
) engine=innodb;
insert into t1 values (1,6,0),(2,1,0),(3,5,2),(4,8,0);
create table t2 (c int) engine=innodb;
insert into t2 values (1),(2);
create table t3 (d int) engine=innodb;
insert into t3 values (3),(-1),(4);
set @save_optimizer_switch=@@optimizer_switch;
set optimizer_switch='extended_keys=on';
explain
select pk, a, b from t1,t2,t3 where b >= d and pk < c and b = '0';
select pk, a, b from t1,t2,t3 where b >= d and pk < c and b = '0';
set optimizer_switch=@save_optimizer_switch;
drop table t1,t2,t3;
CREATE TABLE t1 ( CREATE TABLE t1 (
pk INT PRIMARY KEY, f1 INT, f2 CHAR(1), f3 CHAR(1), pk INT PRIMARY KEY, f1 INT, f2 CHAR(1), f3 CHAR(1),
KEY(f1), KEY(f2) KEY(f1), KEY(f2)
...@@ -88,3 +114,5 @@ select * from t1 where a=10 and b=10; ...@@ -88,3 +114,5 @@ select * from t1 where a=10 and b=10;
DROP TABLE t0,t1; DROP TABLE t0,t1;
SET @@GLOBAL.debug_dbug = @saved_dbug; SET @@GLOBAL.debug_dbug = @saved_dbug;
set @@optimizer_switch= @optimizer_switch_save; set @@optimizer_switch= @optimizer_switch_save;
--echo # End of 10.1 tests
...@@ -101,7 +101,6 @@ wsrep_recover_position() { ...@@ -101,7 +101,6 @@ wsrep_recover_position() {
# Safety checks # Safety checks
if [ -n "$log_file" -a -f "$log_file" ]; then if [ -n "$log_file" -a -f "$log_file" ]; then
[ "$euid" = "0" ] && chown $user $log_file
chmod 600 $log_file chmod 600 $log_file
else else
log "WSREP: mktemp failed" log "WSREP: mktemp failed"
......
...@@ -358,7 +358,8 @@ QUICK_RANGE_SELECT *get_quick_select(PARAM *param,uint index, ...@@ -358,7 +358,8 @@ QUICK_RANGE_SELECT *get_quick_select(PARAM *param,uint index,
static TRP_RANGE *get_key_scans_params(PARAM *param, SEL_TREE *tree, static TRP_RANGE *get_key_scans_params(PARAM *param, SEL_TREE *tree,
bool index_read_must_be_used, bool index_read_must_be_used,
bool update_tbl_stats, bool update_tbl_stats,
double read_time); double read_time,
bool ror_scans_required);
static static
TRP_INDEX_INTERSECT *get_best_index_intersect(PARAM *param, SEL_TREE *tree, TRP_INDEX_INTERSECT *get_best_index_intersect(PARAM *param, SEL_TREE *tree,
double read_time); double read_time);
...@@ -2592,7 +2593,7 @@ int SQL_SELECT::test_quick_select(THD *thd, key_map keys_to_use, ...@@ -2592,7 +2593,7 @@ int SQL_SELECT::test_quick_select(THD *thd, key_map keys_to_use,
/* Get best 'range' plan and prepare data for making other plans */ /* Get best 'range' plan and prepare data for making other plans */
if ((range_trp= get_key_scans_params(&param, tree, FALSE, TRUE, if ((range_trp= get_key_scans_params(&param, tree, FALSE, TRUE,
best_read_time))) best_read_time, FALSE)))
{ {
best_trp= range_trp; best_trp= range_trp;
best_read_time= best_trp->read_cost; best_read_time= best_trp->read_cost;
...@@ -4716,7 +4717,8 @@ TABLE_READ_PLAN *get_best_disjunct_quick(PARAM *param, SEL_IMERGE *imerge, ...@@ -4716,7 +4717,8 @@ TABLE_READ_PLAN *get_best_disjunct_quick(PARAM *param, SEL_IMERGE *imerge,
{ {
DBUG_EXECUTE("info", print_sel_tree(param, *ptree, &(*ptree)->keys_map, DBUG_EXECUTE("info", print_sel_tree(param, *ptree, &(*ptree)->keys_map,
"tree in SEL_IMERGE");); "tree in SEL_IMERGE"););
if (!(*cur_child= get_key_scans_params(param, *ptree, TRUE, FALSE, read_time))) if (!(*cur_child= get_key_scans_params(param, *ptree, TRUE, FALSE,
read_time, TRUE)))
{ {
/* /*
One of index scans in this index_merge is more expensive than entire One of index scans in this index_merge is more expensive than entire
...@@ -5038,7 +5040,7 @@ TABLE_READ_PLAN *merge_same_index_scans(PARAM *param, SEL_IMERGE *imerge, ...@@ -5038,7 +5040,7 @@ TABLE_READ_PLAN *merge_same_index_scans(PARAM *param, SEL_IMERGE *imerge,
index merge retrievals are not well calibrated index merge retrievals are not well calibrated
*/ */
trp= get_key_scans_params(param, *imerge->trees, FALSE, TRUE, trp= get_key_scans_params(param, *imerge->trees, FALSE, TRUE,
read_time); read_time, TRUE);
} }
DBUG_RETURN(trp); DBUG_RETURN(trp);
...@@ -6766,6 +6768,7 @@ TRP_ROR_INTERSECT *get_best_covering_ror_intersect(PARAM *param, ...@@ -6766,6 +6768,7 @@ TRP_ROR_INTERSECT *get_best_covering_ror_intersect(PARAM *param,
index_read_must_be_used if TRUE, assume 'index only' option will be set index_read_must_be_used if TRUE, assume 'index only' option will be set
(except for clustered PK indexes) (except for clustered PK indexes)
read_time don't create read plans with cost > read_time. read_time don't create read plans with cost > read_time.
ror_scans_required set to TRUE for index merge
RETURN RETURN
Best range read plan Best range read plan
NULL if no plan found or error occurred NULL if no plan found or error occurred
...@@ -6774,7 +6777,8 @@ TRP_ROR_INTERSECT *get_best_covering_ror_intersect(PARAM *param, ...@@ -6774,7 +6777,8 @@ TRP_ROR_INTERSECT *get_best_covering_ror_intersect(PARAM *param,
static TRP_RANGE *get_key_scans_params(PARAM *param, SEL_TREE *tree, static TRP_RANGE *get_key_scans_params(PARAM *param, SEL_TREE *tree,
bool index_read_must_be_used, bool index_read_must_be_used,
bool update_tbl_stats, bool update_tbl_stats,
double read_time) double read_time,
bool ror_scans_required)
{ {
uint idx, UNINIT_VAR(best_idx); uint idx, UNINIT_VAR(best_idx);
SEL_ARG *key_to_read= NULL; SEL_ARG *key_to_read= NULL;
...@@ -6822,6 +6826,13 @@ static TRP_RANGE *get_key_scans_params(PARAM *param, SEL_TREE *tree, ...@@ -6822,6 +6826,13 @@ static TRP_RANGE *get_key_scans_params(PARAM *param, SEL_TREE *tree,
update_tbl_stats, &mrr_flags, update_tbl_stats, &mrr_flags,
&buf_size, &cost); &buf_size, &cost);
if (ror_scans_required && !param->is_ror_scan &&
!optimizer_flag(param->thd, OPTIMIZER_SWITCH_INDEX_MERGE_SORT_UNION))
{
/* The scan is not a ROR-scan, just skip it */
continue;
}
if (found_records != HA_POS_ERROR && tree->index_scans && if (found_records != HA_POS_ERROR && tree->index_scans &&
(index_scan= (INDEX_SCAN_INFO *)alloc_root(param->mem_root, (index_scan= (INDEX_SCAN_INFO *)alloc_root(param->mem_root,
sizeof(INDEX_SCAN_INFO)))) sizeof(INDEX_SCAN_INFO))))
...@@ -9069,7 +9080,7 @@ key_and(RANGE_OPT_PARAM *param, SEL_ARG *key1, SEL_ARG *key2, uint clone_flag) ...@@ -9069,7 +9080,7 @@ key_and(RANGE_OPT_PARAM *param, SEL_ARG *key1, SEL_ARG *key2, uint clone_flag)
if (key2->next_key_part) if (key2->next_key_part)
{ {
key1->use_count--; // Incremented in and_all_keys key1->use_count--; // Incremented in and_all_keys
return and_all_keys(param, key1, key2, clone_flag); return and_all_keys(param, key1, key2->next_key_part, clone_flag);
} }
key2->use_count--; // Key2 doesn't have a tree key2->use_count--; // Key2 doesn't have a tree
} }
......
...@@ -75,7 +75,7 @@ PermissionsStartOnly=true ...@@ -75,7 +75,7 @@ PermissionsStartOnly=true
# Do not panic if galera_recovery script is not available. (MDEV-10538) # Do not panic if galera_recovery script is not available. (MDEV-10538)
ExecStartPre=/bin/sh -c "systemctl unset-environment _WSREP_START_POSITION" ExecStartPre=/bin/sh -c "systemctl unset-environment _WSREP_START_POSITION"
ExecStartPre=/bin/sh -c "[ ! -e @bindir@/galera_recovery ] && VAR= || \ ExecStartPre=/bin/sh -c "[ ! -e @bindir@/galera_recovery ] && VAR= || \
VAR=`@bindir@/galera_recovery`; [ $? -eq 0 ] \ VAR=`cd @bindir@/..; @bindir@/galera_recovery`; [ $? -eq 0 ] \
&& systemctl set-environment _WSREP_START_POSITION=$VAR || exit 1" && systemctl set-environment _WSREP_START_POSITION=$VAR || exit 1"
# Needed to create system tables etc. # Needed to create system tables etc.
......
...@@ -84,14 +84,14 @@ PermissionsStartOnly=true ...@@ -84,14 +84,14 @@ PermissionsStartOnly=true
ExecStartPre=/bin/sh -c "systemctl unset-environment _WSREP_START_POSITION%I" ExecStartPre=/bin/sh -c "systemctl unset-environment _WSREP_START_POSITION%I"
ExecStartPre=/bin/sh -c "[ ! -e @bindir@/galera_recovery ] && VAR= || \ ExecStartPre=/bin/sh -c "[ ! -e @bindir@/galera_recovery ] && VAR= || \
VAR=`@bindir@/galera_recovery --defaults-file=@sysconf2dir@/my%I.cnf`; [ $? -eq 0 ] \ VAR=`cd @bindir@/..; @bindir@/galera_recovery --defaults-file=@sysconf2dir@/my%I.cnf`; [ $? -eq 0 ] \
&& systemctl set-environment _WSREP_START_POSITION%I=$VAR || exit 1" && systemctl set-environment _WSREP_START_POSITION%I=$VAR || exit 1"
# Alternate: (remove ConditionPathExists above) # Alternate: (remove ConditionPathExists above)
# use [mysqld.INSTANCENAME] as sections in my.cnf # use [mysqld.INSTANCENAME] as sections in my.cnf
# #
#ExecStartPre=/bin/sh -c "[ ! -e @bindir@/galera_recovery ] && VAR= || \ #ExecStartPre=/bin/sh -c "[ ! -e @bindir@/galera_recovery ] && VAR= || \
# VAR=`@bindir@/galera_recovery --defaults-group-suffix=%I`; [ $? -eq 0 ] \ # VAR=`cd @bindir@/..; @bindir@/galera_recovery --defaults-group-suffix=%I`; [ $? -eq 0 ] \
# && systemctl set-environment _WSREP_START_POSITION%I=$VAR || exit 1" # && systemctl set-environment _WSREP_START_POSITION%I=$VAR || exit 1"
# Needed to create system tables etc. # Needed to create system tables etc.
......
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
[client-server] [client-server]
# #
# include all files from the config directory # include *.cnf from the config directory
# #
!includedir /etc/my.cnf.d !includedir /etc/my.cnf.d
SET(HEIDISQL_BASE_NAME "HeidiSQL_10.2_32_Portable") SET(HEIDISQL_BASE_NAME "HeidiSQL_11.0_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})
......
...@@ -33,20 +33,25 @@ ...@@ -33,20 +33,25 @@
<RegistryValue Root="HKCU" Key="Software\@CPACK_WIX_PACKAGE_NAME@\Uninstall" Name="shortcuts.heidisql" Value="1" Type="string" KeyPath="yes" /> <RegistryValue Root="HKCU" Key="Software\@CPACK_WIX_PACKAGE_NAME@\Uninstall" Name="shortcuts.heidisql" Value="1" Type="string" KeyPath="yes" />
<Shortcut Id="startmenuHeidiSQL" Directory="ShortcutFolder" Name="HeidiSQL" Target="[D.HeidiSQL]\heidisql.exe"/> <Shortcut Id="startmenuHeidiSQL" Directory="ShortcutFolder" Name="HeidiSQL" Target="[D.HeidiSQL]\heidisql.exe"/>
</Component> </Component>
<Component Id="component.HeidiSQL_libmysql.dll" Guid="*" Win64="no"> <Component Id="component.HeidiSQL_libmysql.dll" Guid="*" Win64="no">
<File Id="heidisql.libmysql.dll" Name="libmysql.dll" Source="${HEIDISQL_DOWNLOAD_DIR}\libmysql.dll" /> <File Id="heidisql.libmysql.dll" Name="libmysql.dll" Source="${HEIDISQL_DOWNLOAD_DIR}\libmysql.dll" />
</Component> </Component>
<Component Id="component.HeidiSQL_libmysql_6.1.dll" Guid="*" Win64="no">
<File Id="heidisql.libmysql_6.1.dll" Name="libmysql-6.1.dll" Source="${HEIDISQL_DOWNLOAD_DIR}\libmysql-6.1.dll" />
</Component>
<Component Id="component.HeidiSQL_libmariadb.dll" Guid="*" Win64="no"> <Component Id="component.HeidiSQL_libmariadb.dll" Guid="*" Win64="no">
<File Id="heidisql.libmariadb.dll" Name="libmariadb.dll" Source="${HEIDISQL_DOWNLOAD_DIR}\libmariadb.dll" /> <File Id="heidisql.libmariadb.dll" Name="libmariadb.dll" Source="${HEIDISQL_DOWNLOAD_DIR}\libmariadb.dll" />
</Component> </Component>
<Component Id="component.HeidiSQL_libeay32.dll" Guid="*" Win64="no"> <Component Id="component.HeidiSQL_libssl_1_1.dll" Guid="*" Win64="no">
<File Id="heidisql.libeay32.dll" Name="libeay32.dll" Source="${HEIDISQL_DOWNLOAD_DIR}\libeay32.dll" /> <File Id="heidisql.libssl_1_1.dll" Name="libssl-1_1.dll" Source="${HEIDISQL_DOWNLOAD_DIR}\libssl-1_1.dll" />
</Component> </Component>
<Component Id="component.HeidiSQL_libpq.dll" Guid="*" Win64="no"> <Component Id="component.HeidiSQL_libpq_10.dll" Guid="*" Win64="no">
<File Id="heidisql.libpq.dll" Name="libpq.dll" Source="${HEIDISQL_DOWNLOAD_DIR}\libpq.dll" /> <File Id="heidisql.libpq_10.dll" Name="libpq-10.dll" Source="${HEIDISQL_DOWNLOAD_DIR}\libpq-10.dll" />
</Component> </Component>
<Component Id="component.HeidiSQL_ssleay32.dll" Guid="*" Win64="no"> <Component Id="component.HeidiSQL_libcrypto_1_1.dll" Guid="*" Win64="no">
<File Id="heidisql.ssleay32.dll" Name="ssleay32.dll" Source="${HEIDISQL_DOWNLOAD_DIR}\ssleay32.dll" /> <File Id="heidisql.libcrypto_1_1.dll" Name="libcrypto-1_1.dll" Source="${HEIDISQL_DOWNLOAD_DIR}\libcrypto-1_1.dll" />
</Component> </Component>
<Component Id="component.HeidiSQL_libintl_8.dll" Guid="*" Win64="no"> <Component Id="component.HeidiSQL_libintl_8.dll" Guid="*" Win64="no">
<File Id="heidisql.libintl_8.dll" Name="libintl-8.dll" Source="${HEIDISQL_DOWNLOAD_DIR}\libintl-8.dll" /> <File Id="heidisql.libintl_8.dll" Name="libintl-8.dll" Source="${HEIDISQL_DOWNLOAD_DIR}\libintl-8.dll" />
...@@ -54,6 +59,9 @@ ...@@ -54,6 +59,9 @@
<Component Id="component.HeidiSQL_libiconv_2.dll" Guid="*" Win64="no"> <Component Id="component.HeidiSQL_libiconv_2.dll" Guid="*" Win64="no">
<File Id="heidisql.libiconv_2.dll" Name="libiconv-2.dll" Source="${HEIDISQL_DOWNLOAD_DIR}\libiconv-2.dll" /> <File Id="heidisql.libiconv_2.dll" Name="libiconv-2.dll" Source="${HEIDISQL_DOWNLOAD_DIR}\libiconv-2.dll" />
</Component> </Component>
<Component Id="component.HeidiSQL_sqlite3.dll" Guid="*" Win64="no">
<File Id="heidisql.sqlite3.dll" Name="sqlite3.dll" Source="${HEIDISQL_DOWNLOAD_DIR}\sqlite3.dll" />
</Component>
<Directory Id="D.HeidiSQL.plugins" Name="plugins"> <Directory Id="D.HeidiSQL.plugins" Name="plugins">
<?foreach dll in $(var.pluginlist) ?> <?foreach dll in $(var.pluginlist) ?>
...@@ -76,11 +84,13 @@ ...@@ -76,11 +84,13 @@
<ComponentRef Id="component.HeidiSQL_MenuShortcut"/> <ComponentRef Id="component.HeidiSQL_MenuShortcut"/>
<ComponentRef Id="component.HeidiSQL_libmysql.dll"/> <ComponentRef Id="component.HeidiSQL_libmysql.dll"/>
<ComponentRef Id="component.HeidiSQL_libmariadb.dll"/> <ComponentRef Id="component.HeidiSQL_libmariadb.dll"/>
<ComponentRef Id="component.HeidiSQL_libeay32.dll" /> <ComponentRef Id="component.HeidiSQL_libssl_1_1.dll" />
<ComponentRef Id="component.HeidiSQL_libpq.dll" /> <ComponentRef Id="component.HeidiSQL_libpq_10.dll" />
<ComponentRef Id="component.HeidiSQL_ssleay32.dll" /> <ComponentRef Id="component.HeidiSQL_libcrypto_1_1.dll" />
<ComponentRef Id="component.HeidiSQL_libintl_8.dll" /> <ComponentRef Id="component.HeidiSQL_libintl_8.dll" />
<ComponentRef Id="component.HeidiSQL_libiconv_2.dll" /> <ComponentRef Id="component.HeidiSQL_libiconv_2.dll" />
<ComponentRef Id="component.HeidiSQL_sqlite3.dll" />
<ComponentRef Id="component.HeidiSQL_libmysql_6.1.dll" />
<?foreach dll in $(var.pluginlist)?> <?foreach dll in $(var.pluginlist)?>
<ComponentRef Id="component.HeidiSQL_$(var.dll)" /> <ComponentRef Id="component.HeidiSQL_$(var.dll)" />
<?endforeach?> <?endforeach?>
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment