Merge pull request #721 from oblitorum/PT-2277_impossible_on_condition

PT-2277 - fix pt-visual-explain for 'Impossible ON condition' case
This commit is contained in:
Sveta Smirnova
2023-12-04 13:11:44 +03:00
committed by Sveta Smirnova
3 changed files with 55 additions and 2 deletions

View File

@@ -330,7 +330,7 @@ sub transform {
# Dispatch to a class method to generate the tree. # Dispatch to a class method to generate the tree.
# ################################################################## # ##################################################################
my $no_matching_row = join('|', my $no_matching_row = join('|',
"Impossible (?:WHERE|HAVING)(?: noticed after reading const tables)?", "Impossible (?:WHERE|HAVING|ON)(?: noticed after reading const tables| condition)?",
'No matching.*row', 'No matching.*row',
'(?:unique|const) row not found', '(?:unique|const) row not found',
); );
@@ -499,6 +499,13 @@ sub ref_or_null {
sub const { sub const {
my ( $self, $row ) = @_; my ( $self, $row ) = @_;
if ( !$row->{key} ) {
return {
type => 'Constant table access',
rows => $row->{rows},
children => [$self->table($row)]
}
}
return $self->index_access($row, 'Constant index lookup'); return $self->index_access($row, 'Constant index lookup');
} }

View File

@@ -9,7 +9,7 @@ BEGIN {
use strict; use strict;
use warnings FATAL => 'all'; use warnings FATAL => 'all';
use English qw(-no_match_vars); use English qw(-no_match_vars);
use Test::More tests => 60; use Test::More tests => 61;
use PerconaTest; use PerconaTest;
require "$trunk/bin/pt-visual-explain"; require "$trunk/bin/pt-visual-explain";
@@ -72,6 +72,45 @@ is_deeply(
'Impossible HAVING', 'Impossible HAVING',
); );
$t = $e->parse( load_file("t/pt-visual-explain/samples/impossible_on_condition.sql") );
is_deeply(
$t,
{ type => 'JOIN',
children => [
{ type => 'Constant table access',
id => 1,
rowid => 0,
rows => undef,
warning => 'Impossible ON condition',
children => [
{ type => 'Table',
table => 't',
possible_keys => 't_id',
partitions => undef
}
]
},
{ type => 'Filter with WHERE',
id => 1,
rowid => 1,
children => [
{ type => 'Table scan',
rows => 1,
children => [
{ type => 'Table',
table => 't2',
possible_keys => undef,
partitions => undef
}
]
}
]
}
]
},
"Impossible ON condition"
);
$t = $e->parse( load_file("t/pt-visual-explain/samples/const_row_not_found.sql") ); $t = $e->parse( load_file("t/pt-visual-explain/samples/const_row_not_found.sql") );
is_deeply( is_deeply(
$t, $t,

View File

@@ -0,0 +1,7 @@
explain select * from t2 LEFT JOIN t on t2.id = t.id AND 1 = 0 WHERE t2.id = 1;
+------+-------------+-------+-------+---------------+------+---------+------+------+-------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+------+-------------+-------+-------+---------------+------+---------+------+------+-------------------------+
| 1 | SIMPLE | t | const | t_id | NULL | NULL | NULL | 0 | Impossible ON condition |
| 1 | SIMPLE | t2 | ALL | NULL | NULL | NULL | NULL | 1 | Using where |
+------+-------------+-------+-------+---------------+------+---------+------+------+-------------------------+