diff --git a/bin/pt-archiver b/bin/pt-archiver index 95a5f380..bfe5b2fd 100755 --- a/bin/pt-archiver +++ b/bin/pt-archiver @@ -1454,6 +1454,8 @@ use Data::Dumper; $Data::Dumper::Indent = 0; $Data::Dumper::Quotekeys = 0; +my $dsn_sep = qr/(?{opts}; - foreach my $dsn_part ( split(/,/, $dsn) ) { + foreach my $dsn_part ( split($dsn_sep, $dsn) ) { + $dsn_part =~ s/\\,/,/g; if ( my ($prop_key, $prop_val) = $dsn_part =~ m/^(.)=(.*)$/ ) { $given_props{$prop_key} = $prop_val; } @@ -1567,12 +1570,14 @@ sub parse_options { sub as_string { my ( $self, $dsn, $props ) = @_; return $dsn unless ref $dsn; - my %allowed = $props ? map { $_=>1 } @$props : (); + my @keys = $props ? @$props : sort keys %$dsn; return join(',', - map { "$_=" . ($_ eq 'p' ? '...' : $dsn->{$_}) } - grep { defined $dsn->{$_} && $self->{opts}->{$_} } - grep { !$props || $allowed{$_} } - sort keys %$dsn ); + map { "$_=" . ($_ eq 'p' ? '...' : $dsn->{$_}) } + grep { + exists $self->{opts}->{$_} + && exists $dsn->{$_} + && defined $dsn->{$_} + } @keys); } sub usage { diff --git a/bin/pt-config-diff b/bin/pt-config-diff index f6bb6f78..43e4ae94 100755 --- a/bin/pt-config-diff +++ b/bin/pt-config-diff @@ -1053,6 +1053,8 @@ use Data::Dumper; $Data::Dumper::Indent = 0; $Data::Dumper::Quotekeys = 0; +my $dsn_sep = qr/(?{opts}; - foreach my $dsn_part ( split(/,/, $dsn) ) { + foreach my $dsn_part ( split($dsn_sep, $dsn) ) { + $dsn_part =~ s/\\,/,/g; if ( my ($prop_key, $prop_val) = $dsn_part =~ m/^(.)=(.*)$/ ) { $given_props{$prop_key} = $prop_val; } diff --git a/bin/pt-deadlock-logger b/bin/pt-deadlock-logger index 86d5afbb..64d4597c 100755 --- a/bin/pt-deadlock-logger +++ b/bin/pt-deadlock-logger @@ -1213,6 +1213,8 @@ use Data::Dumper; $Data::Dumper::Indent = 0; $Data::Dumper::Quotekeys = 0; +my $dsn_sep = qr/(?{opts}; - foreach my $dsn_part ( split(/,/, $dsn) ) { + foreach my $dsn_part ( split($dsn_sep, $dsn) ) { + $dsn_part =~ s/\\,/,/g; if ( my ($prop_key, $prop_val) = $dsn_part =~ m/^(.)=(.*)$/ ) { $given_props{$prop_key} = $prop_val; } @@ -1326,12 +1329,14 @@ sub parse_options { sub as_string { my ( $self, $dsn, $props ) = @_; return $dsn unless ref $dsn; - my %allowed = $props ? map { $_=>1 } @$props : (); + my @keys = $props ? @$props : sort keys %$dsn; return join(',', - map { "$_=" . ($_ eq 'p' ? '...' : $dsn->{$_}) } - grep { defined $dsn->{$_} && $self->{opts}->{$_} } - grep { !$props || $allowed{$_} } - sort keys %$dsn ); + map { "$_=" . ($_ eq 'p' ? '...' : $dsn->{$_}) } + grep { + exists $self->{opts}->{$_} + && exists $dsn->{$_} + && defined $dsn->{$_} + } @keys); } sub usage { diff --git a/bin/pt-duplicate-key-checker b/bin/pt-duplicate-key-checker index e952a8b7..e6116482 100755 --- a/bin/pt-duplicate-key-checker +++ b/bin/pt-duplicate-key-checker @@ -923,6 +923,8 @@ use Data::Dumper; $Data::Dumper::Indent = 0; $Data::Dumper::Quotekeys = 0; +my $dsn_sep = qr/(?{opts}; - foreach my $dsn_part ( split(/,/, $dsn) ) { + foreach my $dsn_part ( split($dsn_sep, $dsn) ) { + $dsn_part =~ s/\\,/,/g; if ( my ($prop_key, $prop_val) = $dsn_part =~ m/^(.)=(.*)$/ ) { $given_props{$prop_key} = $prop_val; } @@ -1036,12 +1039,14 @@ sub parse_options { sub as_string { my ( $self, $dsn, $props ) = @_; return $dsn unless ref $dsn; - my %allowed = $props ? map { $_=>1 } @$props : (); + my @keys = $props ? @$props : sort keys %$dsn; return join(',', - map { "$_=" . ($_ eq 'p' ? '...' : $dsn->{$_}) } - grep { defined $dsn->{$_} && $self->{opts}->{$_} } - grep { !$props || $allowed{$_} } - sort keys %$dsn ); + map { "$_=" . ($_ eq 'p' ? '...' : $dsn->{$_}) } + grep { + exists $self->{opts}->{$_} + && exists $dsn->{$_} + && defined $dsn->{$_} + } @keys); } sub usage { diff --git a/bin/pt-find b/bin/pt-find index 2519923a..1f1de483 100755 --- a/bin/pt-find +++ b/bin/pt-find @@ -28,6 +28,8 @@ use Data::Dumper; $Data::Dumper::Indent = 0; $Data::Dumper::Quotekeys = 0; +my $dsn_sep = qr/(?{opts}; - foreach my $dsn_part ( split(/,/, $dsn) ) { + foreach my $dsn_part ( split($dsn_sep, $dsn) ) { + $dsn_part =~ s/\\,/,/g; if ( my ($prop_key, $prop_val) = $dsn_part =~ m/^(.)=(.*)$/ ) { $given_props{$prop_key} = $prop_val; } @@ -141,12 +144,14 @@ sub parse_options { sub as_string { my ( $self, $dsn, $props ) = @_; return $dsn unless ref $dsn; - my %allowed = $props ? map { $_=>1 } @$props : (); + my @keys = $props ? @$props : sort keys %$dsn; return join(',', - map { "$_=" . ($_ eq 'p' ? '...' : $dsn->{$_}) } - grep { defined $dsn->{$_} && $self->{opts}->{$_} } - grep { !$props || $allowed{$_} } - sort keys %$dsn ); + map { "$_=" . ($_ eq 'p' ? '...' : $dsn->{$_}) } + grep { + exists $self->{opts}->{$_} + && exists $dsn->{$_} + && defined $dsn->{$_} + } @keys); } sub usage { diff --git a/bin/pt-fk-error-logger b/bin/pt-fk-error-logger index a05bdfe1..9323386c 100755 --- a/bin/pt-fk-error-logger +++ b/bin/pt-fk-error-logger @@ -1130,6 +1130,8 @@ use Data::Dumper; $Data::Dumper::Indent = 0; $Data::Dumper::Quotekeys = 0; +my $dsn_sep = qr/(?{opts}; - foreach my $dsn_part ( split(/,/, $dsn) ) { + foreach my $dsn_part ( split($dsn_sep, $dsn) ) { + $dsn_part =~ s/\\,/,/g; if ( my ($prop_key, $prop_val) = $dsn_part =~ m/^(.)=(.*)$/ ) { $given_props{$prop_key} = $prop_val; } @@ -1243,12 +1246,14 @@ sub parse_options { sub as_string { my ( $self, $dsn, $props ) = @_; return $dsn unless ref $dsn; - my %allowed = $props ? map { $_=>1 } @$props : (); + my @keys = $props ? @$props : sort keys %$dsn; return join(',', - map { "$_=" . ($_ eq 'p' ? '...' : $dsn->{$_}) } - grep { defined $dsn->{$_} && $self->{opts}->{$_} } - grep { !$props || $allowed{$_} } - sort keys %$dsn ); + map { "$_=" . ($_ eq 'p' ? '...' : $dsn->{$_}) } + grep { + exists $self->{opts}->{$_} + && exists $dsn->{$_} + && defined $dsn->{$_} + } @keys); } sub usage { diff --git a/bin/pt-heartbeat b/bin/pt-heartbeat index 4d3694c4..d186171b 100755 --- a/bin/pt-heartbeat +++ b/bin/pt-heartbeat @@ -1761,6 +1761,8 @@ use Data::Dumper; $Data::Dumper::Indent = 0; $Data::Dumper::Quotekeys = 0; +my $dsn_sep = qr/(?{opts}; - foreach my $dsn_part ( split(/,/, $dsn) ) { + foreach my $dsn_part ( split($dsn_sep, $dsn) ) { + $dsn_part =~ s/\\,/,/g; if ( my ($prop_key, $prop_val) = $dsn_part =~ m/^(.)=(.*)$/ ) { $given_props{$prop_key} = $prop_val; } @@ -1874,12 +1877,14 @@ sub parse_options { sub as_string { my ( $self, $dsn, $props ) = @_; return $dsn unless ref $dsn; - my %allowed = $props ? map { $_=>1 } @$props : (); + my @keys = $props ? @$props : sort keys %$dsn; return join(',', - map { "$_=" . ($_ eq 'p' ? '...' : $dsn->{$_}) } - grep { defined $dsn->{$_} && $self->{opts}->{$_} } - grep { !$props || $allowed{$_} } - sort keys %$dsn ); + map { "$_=" . ($_ eq 'p' ? '...' : $dsn->{$_}) } + grep { + exists $self->{opts}->{$_} + && exists $dsn->{$_} + && defined $dsn->{$_} + } @keys); } sub usage { diff --git a/bin/pt-index-usage b/bin/pt-index-usage index 8c1cbe83..9127a5f4 100755 --- a/bin/pt-index-usage +++ b/bin/pt-index-usage @@ -28,6 +28,8 @@ use Data::Dumper; $Data::Dumper::Indent = 0; $Data::Dumper::Quotekeys = 0; +my $dsn_sep = qr/(?{opts}; - foreach my $dsn_part ( split(/,/, $dsn) ) { + foreach my $dsn_part ( split($dsn_sep, $dsn) ) { + $dsn_part =~ s/\\,/,/g; if ( my ($prop_key, $prop_val) = $dsn_part =~ m/^(.)=(.*)$/ ) { $given_props{$prop_key} = $prop_val; } @@ -141,12 +144,14 @@ sub parse_options { sub as_string { my ( $self, $dsn, $props ) = @_; return $dsn unless ref $dsn; - my %allowed = $props ? map { $_=>1 } @$props : (); + my @keys = $props ? @$props : sort keys %$dsn; return join(',', - map { "$_=" . ($_ eq 'p' ? '...' : $dsn->{$_}) } - grep { defined $dsn->{$_} && $self->{opts}->{$_} } - grep { !$props || $allowed{$_} } - sort keys %$dsn ); + map { "$_=" . ($_ eq 'p' ? '...' : $dsn->{$_}) } + grep { + exists $self->{opts}->{$_} + && exists $dsn->{$_} + && defined $dsn->{$_} + } @keys); } sub usage { diff --git a/bin/pt-kill b/bin/pt-kill index cf759fbc..7155f011 100755 --- a/bin/pt-kill +++ b/bin/pt-kill @@ -1136,6 +1136,8 @@ use Data::Dumper; $Data::Dumper::Indent = 0; $Data::Dumper::Quotekeys = 0; +my $dsn_sep = qr/(?{opts}; - foreach my $dsn_part ( split(/,/, $dsn) ) { + foreach my $dsn_part ( split($dsn_sep, $dsn) ) { + $dsn_part =~ s/\\,/,/g; if ( my ($prop_key, $prop_val) = $dsn_part =~ m/^(.)=(.*)$/ ) { $given_props{$prop_key} = $prop_val; } diff --git a/bin/pt-log-player b/bin/pt-log-player index a1dad620..81297013 100755 --- a/bin/pt-log-player +++ b/bin/pt-log-player @@ -2008,6 +2008,8 @@ use Data::Dumper; $Data::Dumper::Indent = 0; $Data::Dumper::Quotekeys = 0; +my $dsn_sep = qr/(?{opts}; - foreach my $dsn_part ( split(/,/, $dsn) ) { + foreach my $dsn_part ( split($dsn_sep, $dsn) ) { + $dsn_part =~ s/\\,/,/g; if ( my ($prop_key, $prop_val) = $dsn_part =~ m/^(.)=(.*)$/ ) { $given_props{$prop_key} = $prop_val; } @@ -2121,12 +2124,14 @@ sub parse_options { sub as_string { my ( $self, $dsn, $props ) = @_; return $dsn unless ref $dsn; - my %allowed = $props ? map { $_=>1 } @$props : (); + my @keys = $props ? @$props : sort keys %$dsn; return join(',', - map { "$_=" . ($_ eq 'p' ? '...' : $dsn->{$_}) } - grep { defined $dsn->{$_} && $self->{opts}->{$_} } - grep { !$props || $allowed{$_} } - sort keys %$dsn ); + map { "$_=" . ($_ eq 'p' ? '...' : $dsn->{$_}) } + grep { + exists $self->{opts}->{$_} + && exists $dsn->{$_} + && defined $dsn->{$_} + } @keys); } sub usage { diff --git a/bin/pt-online-schema-change b/bin/pt-online-schema-change index 253739e3..2af66b4e 100755 --- a/bin/pt-online-schema-change +++ b/bin/pt-online-schema-change @@ -1136,6 +1136,8 @@ use Data::Dumper; $Data::Dumper::Indent = 0; $Data::Dumper::Quotekeys = 0; +my $dsn_sep = qr/(?{opts}; - foreach my $dsn_part ( split(/,/, $dsn) ) { + foreach my $dsn_part ( split($dsn_sep, $dsn) ) { + $dsn_part =~ s/\\,/,/g; if ( my ($prop_key, $prop_val) = $dsn_part =~ m/^(.)=(.*)$/ ) { $given_props{$prop_key} = $prop_val; } diff --git a/bin/pt-query-advisor b/bin/pt-query-advisor index 16a1b444..ac73a609 100755 --- a/bin/pt-query-advisor +++ b/bin/pt-query-advisor @@ -28,6 +28,8 @@ use Data::Dumper; $Data::Dumper::Indent = 0; $Data::Dumper::Quotekeys = 0; +my $dsn_sep = qr/(?{opts}; - foreach my $dsn_part ( split(/,/, $dsn) ) { + foreach my $dsn_part ( split($dsn_sep, $dsn) ) { + $dsn_part =~ s/\\,/,/g; if ( my ($prop_key, $prop_val) = $dsn_part =~ m/^(.)=(.*)$/ ) { $given_props{$prop_key} = $prop_val; } diff --git a/bin/pt-query-digest b/bin/pt-query-digest index 43cc22cb..7968ef37 100755 --- a/bin/pt-query-digest +++ b/bin/pt-query-digest @@ -28,6 +28,8 @@ use Data::Dumper; $Data::Dumper::Indent = 0; $Data::Dumper::Quotekeys = 0; +my $dsn_sep = qr/(?{opts}; - foreach my $dsn_part ( split(/,/, $dsn) ) { + foreach my $dsn_part ( split($dsn_sep, $dsn) ) { + $dsn_part =~ s/\\,/,/g; if ( my ($prop_key, $prop_val) = $dsn_part =~ m/^(.)=(.*)$/ ) { $given_props{$prop_key} = $prop_val; } @@ -141,12 +144,14 @@ sub parse_options { sub as_string { my ( $self, $dsn, $props ) = @_; return $dsn unless ref $dsn; - my %allowed = $props ? map { $_=>1 } @$props : (); + my @keys = $props ? @$props : sort keys %$dsn; return join(',', - map { "$_=" . ($_ eq 'p' ? '...' : $dsn->{$_}) } - grep { defined $dsn->{$_} && $self->{opts}->{$_} } - grep { !$props || $allowed{$_} } - sort keys %$dsn ); + map { "$_=" . ($_ eq 'p' ? '...' : $dsn->{$_}) } + grep { + exists $self->{opts}->{$_} + && exists $dsn->{$_} + && defined $dsn->{$_} + } @keys); } sub usage { diff --git a/bin/pt-show-grants b/bin/pt-show-grants index fc1ecb96..779c1eac 100755 --- a/bin/pt-show-grants +++ b/bin/pt-show-grants @@ -1053,6 +1053,8 @@ use Data::Dumper; $Data::Dumper::Indent = 0; $Data::Dumper::Quotekeys = 0; +my $dsn_sep = qr/(?{opts}; - foreach my $dsn_part ( split(/,/, $dsn) ) { + foreach my $dsn_part ( split($dsn_sep, $dsn) ) { + $dsn_part =~ s/\\,/,/g; if ( my ($prop_key, $prop_val) = $dsn_part =~ m/^(.)=(.*)$/ ) { $given_props{$prop_key} = $prop_val; } @@ -1166,12 +1169,14 @@ sub parse_options { sub as_string { my ( $self, $dsn, $props ) = @_; return $dsn unless ref $dsn; - my %allowed = $props ? map { $_=>1 } @$props : (); + my @keys = $props ? @$props : sort keys %$dsn; return join(',', - map { "$_=" . ($_ eq 'p' ? '...' : $dsn->{$_}) } - grep { defined $dsn->{$_} && $self->{opts}->{$_} } - grep { !$props || $allowed{$_} } - sort keys %$dsn ); + map { "$_=" . ($_ eq 'p' ? '...' : $dsn->{$_}) } + grep { + exists $self->{opts}->{$_} + && exists $dsn->{$_} + && defined $dsn->{$_} + } @keys); } sub usage { diff --git a/bin/pt-slave-delay b/bin/pt-slave-delay index 46927cfb..ddbb946d 100755 --- a/bin/pt-slave-delay +++ b/bin/pt-slave-delay @@ -1136,6 +1136,8 @@ use Data::Dumper; $Data::Dumper::Indent = 0; $Data::Dumper::Quotekeys = 0; +my $dsn_sep = qr/(?{opts}; - foreach my $dsn_part ( split(/,/, $dsn) ) { + foreach my $dsn_part ( split($dsn_sep, $dsn) ) { + $dsn_part =~ s/\\,/,/g; if ( my ($prop_key, $prop_val) = $dsn_part =~ m/^(.)=(.*)$/ ) { $given_props{$prop_key} = $prop_val; } @@ -1249,12 +1252,14 @@ sub parse_options { sub as_string { my ( $self, $dsn, $props ) = @_; return $dsn unless ref $dsn; - my %allowed = $props ? map { $_=>1 } @$props : (); + my @keys = $props ? @$props : sort keys %$dsn; return join(',', - map { "$_=" . ($_ eq 'p' ? '...' : $dsn->{$_}) } - grep { defined $dsn->{$_} && $self->{opts}->{$_} } - grep { !$props || $allowed{$_} } - sort keys %$dsn ); + map { "$_=" . ($_ eq 'p' ? '...' : $dsn->{$_}) } + grep { + exists $self->{opts}->{$_} + && exists $dsn->{$_} + && defined $dsn->{$_} + } @keys); } sub usage { diff --git a/bin/pt-slave-find b/bin/pt-slave-find index 033c5e3a..7dcbfcff 100755 --- a/bin/pt-slave-find +++ b/bin/pt-slave-find @@ -1053,6 +1053,8 @@ use Data::Dumper; $Data::Dumper::Indent = 0; $Data::Dumper::Quotekeys = 0; +my $dsn_sep = qr/(?{opts}; - foreach my $dsn_part ( split(/,/, $dsn) ) { + foreach my $dsn_part ( split($dsn_sep, $dsn) ) { + $dsn_part =~ s/\\,/,/g; if ( my ($prop_key, $prop_val) = $dsn_part =~ m/^(.)=(.*)$/ ) { $given_props{$prop_key} = $prop_val; } @@ -1166,12 +1169,14 @@ sub parse_options { sub as_string { my ( $self, $dsn, $props ) = @_; return $dsn unless ref $dsn; - my %allowed = $props ? map { $_=>1 } @$props : (); + my @keys = $props ? @$props : sort keys %$dsn; return join(',', - map { "$_=" . ($_ eq 'p' ? '...' : $dsn->{$_}) } - grep { defined $dsn->{$_} && $self->{opts}->{$_} } - grep { !$props || $allowed{$_} } - sort keys %$dsn ); + map { "$_=" . ($_ eq 'p' ? '...' : $dsn->{$_}) } + grep { + exists $self->{opts}->{$_} + && exists $dsn->{$_} + && defined $dsn->{$_} + } @keys); } sub usage { diff --git a/bin/pt-slave-restart b/bin/pt-slave-restart index a94df31f..36f19d8b 100755 --- a/bin/pt-slave-restart +++ b/bin/pt-slave-restart @@ -1213,6 +1213,8 @@ use Data::Dumper; $Data::Dumper::Indent = 0; $Data::Dumper::Quotekeys = 0; +my $dsn_sep = qr/(?{opts}; - foreach my $dsn_part ( split(/,/, $dsn) ) { + foreach my $dsn_part ( split($dsn_sep, $dsn) ) { + $dsn_part =~ s/\\,/,/g; if ( my ($prop_key, $prop_val) = $dsn_part =~ m/^(.)=(.*)$/ ) { $given_props{$prop_key} = $prop_val; } @@ -1326,12 +1329,14 @@ sub parse_options { sub as_string { my ( $self, $dsn, $props ) = @_; return $dsn unless ref $dsn; - my %allowed = $props ? map { $_=>1 } @$props : (); + my @keys = $props ? @$props : sort keys %$dsn; return join(',', - map { "$_=" . ($_ eq 'p' ? '...' : $dsn->{$_}) } - grep { defined $dsn->{$_} && $self->{opts}->{$_} } - grep { !$props || $allowed{$_} } - sort keys %$dsn ); + map { "$_=" . ($_ eq 'p' ? '...' : $dsn->{$_}) } + grep { + exists $self->{opts}->{$_} + && exists $dsn->{$_} + && defined $dsn->{$_} + } @keys); } sub usage { diff --git a/bin/pt-table-checksum b/bin/pt-table-checksum index 0c3f7858..97ad6941 100755 --- a/bin/pt-table-checksum +++ b/bin/pt-table-checksum @@ -28,6 +28,8 @@ use Data::Dumper; $Data::Dumper::Indent = 0; $Data::Dumper::Quotekeys = 0; +my $dsn_sep = qr/(?{opts}; - foreach my $dsn_part ( split(/,/, $dsn) ) { + foreach my $dsn_part ( split($dsn_sep, $dsn) ) { + $dsn_part =~ s/\\,/,/g; if ( my ($prop_key, $prop_val) = $dsn_part =~ m/^(.)=(.*)$/ ) { $given_props{$prop_key} = $prop_val; } diff --git a/bin/pt-table-sync b/bin/pt-table-sync index 61c44432..fc5f897e 100755 --- a/bin/pt-table-sync +++ b/bin/pt-table-sync @@ -1172,6 +1172,8 @@ use Data::Dumper; $Data::Dumper::Indent = 0; $Data::Dumper::Quotekeys = 0; +my $dsn_sep = qr/(?{opts}; - foreach my $dsn_part ( split(/,/, $dsn) ) { + foreach my $dsn_part ( split($dsn_sep, $dsn) ) { + $dsn_part =~ s/\\,/,/g; if ( my ($prop_key, $prop_val) = $dsn_part =~ m/^(.)=(.*)$/ ) { $given_props{$prop_key} = $prop_val; } diff --git a/bin/pt-table-usage b/bin/pt-table-usage index 626253f5..cace3798 100755 --- a/bin/pt-table-usage +++ b/bin/pt-table-usage @@ -28,6 +28,8 @@ use Data::Dumper; $Data::Dumper::Indent = 0; $Data::Dumper::Quotekeys = 0; +my $dsn_sep = qr/(?{opts}; - foreach my $dsn_part ( split(/,/, $dsn) ) { + foreach my $dsn_part ( split($dsn_sep, $dsn) ) { + $dsn_part =~ s/\\,/,/g; if ( my ($prop_key, $prop_val) = $dsn_part =~ m/^(.)=(.*)$/ ) { $given_props{$prop_key} = $prop_val; } diff --git a/bin/pt-upgrade b/bin/pt-upgrade index 7331abae..c20b8fb7 100755 --- a/bin/pt-upgrade +++ b/bin/pt-upgrade @@ -28,6 +28,8 @@ use Data::Dumper; $Data::Dumper::Indent = 0; $Data::Dumper::Quotekeys = 0; +my $dsn_sep = qr/(?{opts}; - foreach my $dsn_part ( split(/,/, $dsn) ) { + foreach my $dsn_part ( split($dsn_sep, $dsn) ) { + $dsn_part =~ s/\\,/,/g; if ( my ($prop_key, $prop_val) = $dsn_part =~ m/^(.)=(.*)$/ ) { $given_props{$prop_key} = $prop_val; } diff --git a/bin/pt-variable-advisor b/bin/pt-variable-advisor index 0d62022e..000b7e7e 100755 --- a/bin/pt-variable-advisor +++ b/bin/pt-variable-advisor @@ -1053,6 +1053,8 @@ use Data::Dumper; $Data::Dumper::Indent = 0; $Data::Dumper::Quotekeys = 0; +my $dsn_sep = qr/(?{opts}; - foreach my $dsn_part ( split(/,/, $dsn) ) { + foreach my $dsn_part ( split($dsn_sep, $dsn) ) { + $dsn_part =~ s/\\,/,/g; if ( my ($prop_key, $prop_val) = $dsn_part =~ m/^(.)=(.*)$/ ) { $given_props{$prop_key} = $prop_val; } @@ -1166,12 +1169,14 @@ sub parse_options { sub as_string { my ( $self, $dsn, $props ) = @_; return $dsn unless ref $dsn; - my %allowed = $props ? map { $_=>1 } @$props : (); + my @keys = $props ? @$props : sort keys %$dsn; return join(',', - map { "$_=" . ($_ eq 'p' ? '...' : $dsn->{$_}) } - grep { defined $dsn->{$_} && $self->{opts}->{$_} } - grep { !$props || $allowed{$_} } - sort keys %$dsn ); + map { "$_=" . ($_ eq 'p' ? '...' : $dsn->{$_}) } + grep { + exists $self->{opts}->{$_} + && exists $dsn->{$_} + && defined $dsn->{$_} + } @keys); } sub usage { diff --git a/bin/pt-visual-explain b/bin/pt-visual-explain index f4c00a64..f0365e31 100755 --- a/bin/pt-visual-explain +++ b/bin/pt-visual-explain @@ -1725,6 +1725,8 @@ use Data::Dumper; $Data::Dumper::Indent = 0; $Data::Dumper::Quotekeys = 0; +my $dsn_sep = qr/(?{opts}; - foreach my $dsn_part ( split(/,/, $dsn) ) { + foreach my $dsn_part ( split($dsn_sep, $dsn) ) { + $dsn_part =~ s/\\,/,/g; if ( my ($prop_key, $prop_val) = $dsn_part =~ m/^(.)=(.*)$/ ) { $given_props{$prop_key} = $prop_val; } @@ -1838,12 +1841,14 @@ sub parse_options { sub as_string { my ( $self, $dsn, $props ) = @_; return $dsn unless ref $dsn; - my %allowed = $props ? map { $_=>1 } @$props : (); + my @keys = $props ? @$props : sort keys %$dsn; return join(',', - map { "$_=" . ($_ eq 'p' ? '...' : $dsn->{$_}) } - grep { defined $dsn->{$_} && $self->{opts}->{$_} } - grep { !$props || $allowed{$_} } - sort keys %$dsn ); + map { "$_=" . ($_ eq 'p' ? '...' : $dsn->{$_}) } + grep { + exists $self->{opts}->{$_} + && exists $dsn->{$_} + && defined $dsn->{$_} + } @keys); } sub usage {