mirror of
https://github.com/percona/percona-toolkit.git
synced 2025-12-21 02:00:45 +08:00
PT-202 pt-online-schema-change fails with virtual columns
Modified TableParser to ignore GENERATED columns from the columns list used to construct SELECTs/INSERTs
This commit is contained in:
@@ -159,8 +159,8 @@ sub parse {
|
||||
|
||||
# Find column types, whether numeric, whether nullable, whether
|
||||
# auto-increment.
|
||||
my (@nums, @null);
|
||||
my (%type_for, %is_nullable, %is_numeric, %is_autoinc);
|
||||
my (@nums, @null, @non_generated);
|
||||
my (%type_for, %is_nullable, %is_numeric, %is_autoinc, %is_generated);
|
||||
foreach my $col ( @cols ) {
|
||||
my $def = $def_for{$col};
|
||||
|
||||
@@ -180,6 +180,11 @@ sub parse {
|
||||
push @null, $col;
|
||||
$is_nullable{$col} = 1;
|
||||
}
|
||||
if ( remove_quoted_text($def) =~ m/\WGENERATED\W/i ) {
|
||||
$is_generated{$col} = 1;
|
||||
} else {
|
||||
push @non_generated, $col;
|
||||
}
|
||||
$is_autoinc{$col} = $def =~ m/AUTO_INCREMENT/i ? 1 : 0;
|
||||
}
|
||||
|
||||
@@ -191,24 +196,34 @@ sub parse {
|
||||
my ($charset) = $ddl =~ m/DEFAULT CHARSET=(\w+)/;
|
||||
|
||||
return {
|
||||
name => $name,
|
||||
cols => \@cols,
|
||||
col_posn => { map { $cols[$_] => $_ } 0..$#cols },
|
||||
is_col => { map { $_ => 1 } @cols },
|
||||
null_cols => \@null,
|
||||
is_nullable => \%is_nullable,
|
||||
is_autoinc => \%is_autoinc,
|
||||
clustered_key => $clustered_key,
|
||||
keys => $keys,
|
||||
defs => \%def_for,
|
||||
numeric_cols => \@nums,
|
||||
is_numeric => \%is_numeric,
|
||||
engine => $engine,
|
||||
type_for => \%type_for,
|
||||
charset => $charset,
|
||||
name => $name,
|
||||
cols => \@cols,
|
||||
col_posn => { map { $cols[$_] => $_ } 0..$#cols },
|
||||
is_col => { map { $_ => 1 } @non_generated },
|
||||
null_cols => \@null,
|
||||
is_nullable => \%is_nullable,
|
||||
non_generated_cols => \@non_generated,
|
||||
is_autoinc => \%is_autoinc,
|
||||
is_generated => \%is_generated,
|
||||
clustered_key => $clustered_key,
|
||||
keys => $keys,
|
||||
defs => \%def_for,
|
||||
numeric_cols => \@nums,
|
||||
is_numeric => \%is_numeric,
|
||||
engine => $engine,
|
||||
type_for => \%type_for,
|
||||
charset => $charset,
|
||||
};
|
||||
}
|
||||
|
||||
sub remove_quoted_text {
|
||||
my ($string) = @_;
|
||||
$string =~ s/[^\\]`[^`]*[^\\]`//g;
|
||||
$string =~ s/[^\\]"[^"]*[^\\]"//g;
|
||||
$string =~ s/[^\\]"[^"]*[^\\]"//g;
|
||||
return $string;
|
||||
}
|
||||
|
||||
# Sorts indexes in this order: PRIMARY, unique, non-nullable, any (shortest
|
||||
# first, alphabetical). Only BTREE indexes are considered.
|
||||
# TODO: consider length as # of bytes instead of # of columns.
|
||||
|
||||
Reference in New Issue
Block a user