Skip to content
Permalink
Browse files
Merge 10.3 into 10.4
  • Loading branch information
dr-m committed Jan 13, 2023
2 parents 12618cf + 7a98d23 commit 71e8e49
Show file tree
Hide file tree
Showing 20 changed files with 688 additions and 80 deletions.
@@ -1,4 +1,5 @@
drop table if exists t0,t1,t2,t3,t4,t5;
drop view if exists v0,v1,v2,v3;
SET @org_optimizer_switch=@@optimizer_switch;
SET optimizer_switch=ifnull(@optimizer_switch_for_join_outer_test,'outer_join_with_cache=off');
set join_cache_level=1;
@@ -2825,5 +2826,89 @@ WHERE t3.pk IN (2);
1
drop view v4;
drop table t1,t2,t3,t4;
#
# MDEV-28602 Wrong result with outer join, merged derived table and view
#
create table t1 (
Election int(10) unsigned NOT NULL
);
insert into t1 (Election) values (1);
create table t2 (
VoteID int(10),
ElectionID int(10),
UserID int(10)
);
insert into t2 (ElectionID, UserID) values (2, 30), (3, 30);
create view v1 as select * from t1
left join ( select 'Y' AS Voted, ElectionID from t2 ) AS T
on T.ElectionID = t1.Election
limit 9;
select * from v1;
Election Voted ElectionID
1 NULL NULL
drop table t1, t2;
drop view v1;
#
# and another contrived example showing a bit of heirarchy
#
create table t10 (a int);
create table t20 (b int);
insert into t10 values (1),(2);
insert into t20 values (1),(3);
create view v10 as select *, 'U' as u from t10 left join (select 'Y' as y, t20.b from t20) dt1 on t10.a= dt1.b limit 3;
create table t30 (c int);
insert into t30 values (1),(3);
create view v20 as select * from t30 left join (select 'X' as x, v10.u, v10.y, v10.b from v10) dt2 on t30.c=dt2.b limit 6;
select * from v20 limit 9;
c x u y b
1 X U Y 1
3 NULL NULL NULL NULL
drop view v10, v20;
drop table t10, t20, t30;
#
# More complex testcase
#
create table t2 (b int);
insert into t2 values (3),(7),(1);
create table t3 (c int);
insert into t3 values (3),(1);
create table t1 (a int);
insert into t1 values (1),(2),(7),(1);
select * from
(
select * from
(select 'Z' as z, t1.a from t1) dt1
left join
(select 'Y' as y, t2.b from t2) dt2
left join
(select 'X' as x, t3.c from t3) dt3
on dt2.b=dt3.c
on dt1.a=dt2.b
limit 9
) dt;
z a y b x c
Z 1 Y 1 X 1
Z 2 NULL NULL NULL NULL
Z 7 Y 7 NULL NULL
Z 1 Y 1 X 1
create view v3(x,c) as select * from (select 'X' as x, t3.c from t3) dt3;
create view v2(y,b) as select * from (select 'Y' as y, t2.b from t2) dt2;
create view v0(y,b,x,c) as select * from v2 left join v3 on v2.b=v3.c;
create view v1 as select 'Z' as z, t1.a, v0.* from t1 left join v0 on t1.a=v0.b limit 9;
select * from v1;
z a y b x c
Z 1 Y 1 X 1
Z 2 NULL NULL NULL NULL
Z 7 Y 7 NULL NULL
Z 1 Y 1 X 1
set statement join_cache_level=0 for
select * from v1;
z a y b x c
Z 1 Y 1 X 1
Z 2 NULL NULL NULL NULL
Z 7 Y 7 NULL NULL
Z 1 Y 1 X 1
drop view v0, v1, v2, v3;
drop table t1, t2, t3;
# end of 10.3 tests
SET optimizer_switch=@org_optimizer_switch;
@@ -6,6 +6,7 @@

--disable_warnings
drop table if exists t0,t1,t2,t3,t4,t5;
drop view if exists v0,v1,v2,v3;
--enable_warnings

SET @org_optimizer_switch=@@optimizer_switch;
@@ -2341,6 +2342,90 @@ WHERE t3.pk IN (2);
drop view v4;
drop table t1,t2,t3,t4;

--echo #
--echo # MDEV-28602 Wrong result with outer join, merged derived table and view
--echo #

create table t1 (
Election int(10) unsigned NOT NULL
);

insert into t1 (Election) values (1);

create table t2 (
VoteID int(10),
ElectionID int(10),
UserID int(10)
);

insert into t2 (ElectionID, UserID) values (2, 30), (3, 30);
create view v1 as select * from t1
left join ( select 'Y' AS Voted, ElectionID from t2 ) AS T
on T.ElectionID = t1.Election
limit 9;
# limit X causes merge algorithm select as opposed to temp table
select * from v1;
drop table t1, t2;
drop view v1;

--echo #
--echo # and another contrived example showing a bit of heirarchy
--echo #
create table t10 (a int);
create table t20 (b int);
insert into t10 values (1),(2);
insert into t20 values (1),(3);
create view v10 as select *, 'U' as u from t10 left join (select 'Y' as y, t20.b from t20) dt1 on t10.a= dt1.b limit 3;
create table t30 (c int);
insert into t30 values (1),(3);
create view v20 as select * from t30 left join (select 'X' as x, v10.u, v10.y, v10.b from v10) dt2 on t30.c=dt2.b limit 6;
select * from v20 limit 9;
drop view v10, v20;
drop table t10, t20, t30;

--echo #
--echo # More complex testcase
--echo #
create table t2 (b int);
insert into t2 values (3),(7),(1);
create table t3 (c int);
insert into t3 values (3),(1);
create table t1 (a int);
insert into t1 values (1),(2),(7),(1);

select * from
(
select * from
(select 'Z' as z, t1.a from t1) dt1
left join
(select 'Y' as y, t2.b from t2) dt2
left join
(select 'X' as x, t3.c from t3) dt3
on dt2.b=dt3.c
on dt1.a=dt2.b
limit 9
) dt;

## Same as dt3 above
create view v3(x,c) as select * from (select 'X' as x, t3.c from t3) dt3;

## Same as dt2 above
create view v2(y,b) as select * from (select 'Y' as y, t2.b from t2) dt2;

## Same as (...) in the "... dt1 left join (...)" above
create view v0(y,b,x,c) as select * from v2 left join v3 on v2.b=v3.c;

# Same as above select statement
create view v1 as select 'Z' as z, t1.a, v0.* from t1 left join v0 on t1.a=v0.b limit 9;

select * from v1;

set statement join_cache_level=0 for
select * from v1;

drop view v0, v1, v2, v3;
drop table t1, t2, t3;

--echo # end of 10.3 tests

SET optimizer_switch=@org_optimizer_switch;
@@ -6,6 +6,7 @@ set @@join_cache_level=6;
set @optimizer_switch_for_join_outer_test=@@optimizer_switch;
set @join_cache_level_for_join_outer_test=@@join_cache_level;
drop table if exists t0,t1,t2,t3,t4,t5;
drop view if exists v0,v1,v2,v3;
SET @org_optimizer_switch=@@optimizer_switch;
SET optimizer_switch=ifnull(@optimizer_switch_for_join_outer_test,'outer_join_with_cache=off');
set join_cache_level=@join_cache_level_for_join_outer_test;
@@ -2832,5 +2833,89 @@ WHERE t3.pk IN (2);
1
drop view v4;
drop table t1,t2,t3,t4;
#
# MDEV-28602 Wrong result with outer join, merged derived table and view
#
create table t1 (
Election int(10) unsigned NOT NULL
);
insert into t1 (Election) values (1);
create table t2 (
VoteID int(10),
ElectionID int(10),
UserID int(10)
);
insert into t2 (ElectionID, UserID) values (2, 30), (3, 30);
create view v1 as select * from t1
left join ( select 'Y' AS Voted, ElectionID from t2 ) AS T
on T.ElectionID = t1.Election
limit 9;
select * from v1;
Election Voted ElectionID
1 NULL NULL
drop table t1, t2;
drop view v1;
#
# and another contrived example showing a bit of heirarchy
#
create table t10 (a int);
create table t20 (b int);
insert into t10 values (1),(2);
insert into t20 values (1),(3);
create view v10 as select *, 'U' as u from t10 left join (select 'Y' as y, t20.b from t20) dt1 on t10.a= dt1.b limit 3;
create table t30 (c int);
insert into t30 values (1),(3);
create view v20 as select * from t30 left join (select 'X' as x, v10.u, v10.y, v10.b from v10) dt2 on t30.c=dt2.b limit 6;
select * from v20 limit 9;
c x u y b
1 X U Y 1
3 NULL NULL NULL NULL
drop view v10, v20;
drop table t10, t20, t30;
#
# More complex testcase
#
create table t2 (b int);
insert into t2 values (3),(7),(1);
create table t3 (c int);
insert into t3 values (3),(1);
create table t1 (a int);
insert into t1 values (1),(2),(7),(1);
select * from
(
select * from
(select 'Z' as z, t1.a from t1) dt1
left join
(select 'Y' as y, t2.b from t2) dt2
left join
(select 'X' as x, t3.c from t3) dt3
on dt2.b=dt3.c
on dt1.a=dt2.b
limit 9
) dt;
z a y b x c
Z 1 Y 1 X 1
Z 1 Y 1 X 1
Z 7 Y 7 NULL NULL
Z 2 NULL NULL NULL NULL
create view v3(x,c) as select * from (select 'X' as x, t3.c from t3) dt3;
create view v2(y,b) as select * from (select 'Y' as y, t2.b from t2) dt2;
create view v0(y,b,x,c) as select * from v2 left join v3 on v2.b=v3.c;
create view v1 as select 'Z' as z, t1.a, v0.* from t1 left join v0 on t1.a=v0.b limit 9;
select * from v1;
z a y b x c
Z 1 Y 1 X 1
Z 1 Y 1 X 1
Z 7 Y 7 NULL NULL
Z 2 NULL NULL NULL NULL
set statement join_cache_level=0 for
select * from v1;
z a y b x c
Z 1 Y 1 X 1
Z 2 NULL NULL NULL NULL
Z 7 Y 7 NULL NULL
Z 1 Y 1 X 1
drop view v0, v1, v2, v3;
drop table t1, t2, t3;
# end of 10.3 tests
SET optimizer_switch=@org_optimizer_switch;
@@ -0,0 +1,15 @@
CREATE TABLE t1 (a TEXT, ac TEXT COMPRESSED, b TINYTEXT, bc TINYTEXT COMPRESSED, c MEDIUMTEXT, cc MEDIUMTEXT COMPRESSED, d LONGTEXT, dc LONGTEXT COMPRESSED, e VARCHAR(10), ec VARCHAR(10) COMPRESSED);
# Isolate row event into its own binary log
FLUSH BINARY LOGS;
INSERT INTO t1 VALUES ('mya', 'myac', 'myb', 'mybc', 'myc', 'mycc', 'myd', 'mydc', 'mye', 'myec');
FLUSH BINARY LOGS;
# MYSQLBINLOG --base64-output=decode-rows -vv datadir/binlog_file --result-file=result_binlog
include/assert_grep.inc [Ensure compressed TEXT fields are annotated correctly]
include/assert_grep.inc [Ensure compressed TINYTEXT fields are annotated correctly]
include/assert_grep.inc [Ensure compressed MEDIUMTEXT fields are annotated correctly]
include/assert_grep.inc [Ensure compressed LONGTEXT fields are annotated correctly]
include/assert_grep.inc [Ensure compressed VARSTRING fields are annotated correctly]
include/assert_grep.inc [Ensure COMPRESSED only shows up for corresponding fields]
include/assert_grep.inc [Ensure non-compressed TEXT fields are annotated correctly]
include/assert_grep.inc [Ensure non-compressed VARSTRING fields are annotated correctly]
DROP TABLE t1;
@@ -0,0 +1,70 @@
#
# Purpose:
# This test validates that mysqlbinlog is able to annotate compressed column
# types with two levels of verbosity.
#
# Methodology:
# Validate that the output from mysqlbinlog -vv after creating and inserting
# into a table with compressed and uncompressed fields correctly annotates
# which columns are compressed
#
# References:
# MDEV-25277: mysqlbinlog --verbose cannot read row events with compressed
# columns: Don't know how to handle column type: 140
#
--source include/have_binlog_format_row.inc

CREATE TABLE t1 (a TEXT, ac TEXT COMPRESSED, b TINYTEXT, bc TINYTEXT COMPRESSED, c MEDIUMTEXT, cc MEDIUMTEXT COMPRESSED, d LONGTEXT, dc LONGTEXT COMPRESSED, e VARCHAR(10), ec VARCHAR(10) COMPRESSED);

--echo # Isolate row event into its own binary log
FLUSH BINARY LOGS;
INSERT INTO t1 VALUES ('mya', 'myac', 'myb', 'mybc', 'myc', 'mycc', 'myd', 'mydc', 'mye', 'myec');
FLUSH BINARY LOGS;

--let $binlog_file= query_get_value(SHOW BINARY LOGS, Log_name, 2)
--let $datadir= `SELECT @@datadir`
--let $result_binlog= $MYSQLTEST_VARDIR/tmp/$binlog_file

--echo # MYSQLBINLOG --base64-output=decode-rows -vv datadir/binlog_file --result-file=result_binlog
--exec $MYSQL_BINLOG --base64-output=decode-rows -vv $datadir/$binlog_file --result-file=$result_binlog

--let $assert_file= $result_binlog
--let $assert_count= 1

--let $assert_text= Ensure compressed TEXT fields are annotated correctly
--let $assert_select=\WTEXT COMPRESSED
--source include/assert_grep.inc

--let $assert_text= Ensure compressed TINYTEXT fields are annotated correctly
--let $assert_select=\WTINYTEXT COMPRESSED
--source include/assert_grep.inc

--let $assert_text= Ensure compressed MEDIUMTEXT fields are annotated correctly
--let $assert_select=\WMEDIUMTEXT COMPRESSED
--source include/assert_grep.inc

--let $assert_text= Ensure compressed LONGTEXT fields are annotated correctly
--let $assert_select=\WLONGTEXT COMPRESSED
--source include/assert_grep.inc

--let $assert_text= Ensure compressed VARSTRING fields are annotated correctly
--let $assert_select=\WVARSTRING\(\d+\) COMPRESSED
--source include/assert_grep.inc

--let $assert_text= Ensure COMPRESSED only shows up for corresponding fields
--let $assert_count= 5
--let $assert_select= COMPRESSED
--source include/assert_grep.inc

--let $assert_text= Ensure non-compressed TEXT fields are annotated correctly
--let $assert_count= 8
--let $assert_select=/*.*TEXT
--source include/assert_grep.inc

--let $assert_text= Ensure non-compressed VARSTRING fields are annotated correctly
--let $assert_count= 2
--let $assert_select=/*.*VARSTRING
--source include/assert_grep.inc

# Cleanup
DROP TABLE t1;

0 comments on commit 71e8e49

Please sign in to comment.