diff --git a/bin/pt-online-schema-change b/bin/pt-online-schema-change index a796074b..e55d6f5b 100755 --- a/bin/pt-online-schema-change +++ b/bin/pt-online-schema-change @@ -8029,14 +8029,24 @@ my $term_readkey = eval { use sigtrap 'handler', \&sig_int, 'normal-signals'; - - my $exit_status = 0; my $oktorun = 1; my $dont_interrupt_now = 0; my @drop_trigger_sqls; my @triggers_not_dropped; my $pxc_version = '0'; +# Completely ignore these error codes. +my %ignore_code = ( + # Error: 1592 SQLSTATE: HY000 (ER_BINLOG_UNSAFE_STATEMENT) + # Message: Statement may not be safe to log in statement format. + # Ignore this warning because we have purposely set statement-based + # replication. + 1592 => 1, + # Error: 1062 SQLSTATE: 23000 ( ER_DUP_ENTRY ) + # Message: Duplicate entry '%ld' for key '%s' + # MariaDB 5.5.28+ has this as a warning; See https://bugs.launchpad.net/percona-toolkit/+bug/1099836 + 1062 => 1, +); $OUTPUT_AUTOFLUSH = 1; @@ -8049,6 +8059,7 @@ sub main { @drop_trigger_sqls = (); @triggers_not_dropped = (); $dont_interrupt_now = 0; + %ignore_code = (1592 => 1, 1062 => 1); my %stats = ( INSERT => 0, @@ -8062,6 +8073,10 @@ sub main { $o->get_specs(); $o->get_opts(); + if ( $o->get('null-to-not-null') ) { + $ignore_code{1048} = 1; + } + my $dp = $o->DSNParser(); $dp->prop('set-vars', $o->set_vars()); @@ -10749,18 +10764,6 @@ sub exec_nibble { my $chunk = $nibble_iter->nibble_number(); my $chunk_index = $nibble_iter->nibble_index(); - # Completely ignore these error codes. - my %ignore_code = ( - # Error: 1592 SQLSTATE: HY000 (ER_BINLOG_UNSAFE_STATEMENT) - # Message: Statement may not be safe to log in statement format. - # Ignore this warning because we have purposely set statement-based - # replication. - 1592 => 1, - # Error: 1062 SQLSTATE: 23000 ( ER_DUP_ENTRY ) - # Message: Duplicate entry '%ld' for key '%s' - # MariaDB 5.5.28+ has this as a warning; See https://bugs.launchpad.net/percona-toolkit/+bug/1099836 - 1062 => 1, - ); # Warn once per-table for these error codes if the error message # matches the pattern. @@ -11614,6 +11617,13 @@ to 10 C<_> (underscore) to find a unique table name. If a table name is specified, the tool does not prefix it with C<_>, so the table must not exist. +=item --null-to-not-null + +Allows MODIFYing a column that allows NULL values to one that doesn't allow +them. The rows which contain NULL values will be converted to the defined +default value. If no explicit DEFAULT value is given MySQL will assign a default +value based on datatype, e.g. 0 for number datatypes, '' for string datatypes. + =item --password short form: -p; type: string diff --git a/t/pt-online-schema-change/bugs.t b/t/pt-online-schema-change/bugs.t index 182e9f52..056e097d 100644 --- a/t/pt-online-schema-change/bugs.t +++ b/t/pt-online-schema-change/bugs.t @@ -38,6 +38,51 @@ my $output; my $exit_status; my $sample = "t/pt-online-schema-change/samples/"; +# ############################################################################ +# https://bugs.launchpad.net/percona-toolkit/+bug/1336734 +# pt-online-schema-change 2.2.17 adds --null-to-not-null feature +# ############################################################################ +$sb->load_file('master', "$sample/bug-1336734.sql"); + +($output, $exit_status) = full_output( + sub { pt_online_schema_change::main(@args, + "$master_dsn,D=test,t=lp1336734", + "--execute", + "--null-to-not-null", + # notice we are not using a DEFAULT value, to also + # test if the "default default" value for datatype + # is used + "--alter", "MODIFY COLUMN name VARCHAR(20) NOT NULL", + qw(--chunk-size 2 --print)) }, +); + +my $test_rows = $master_dbh->selectall_arrayref("SELECT id, name FROM test.lp1336734 ORDER BY id"); +ok (!$exit_status, + "--null-to-not-null exit status = 0" +); +is_deeply( + $test_rows, + [ + [ + '1', + 'curly' + ], + [ + '2', + 'larry' + ], + [ + '3', + '' + ], + [ + '4', + 'moe' + ] + ], + "--null-to-not-null default value good" +); + # ############################################################################ # https://bugs.launchpad.net/percona-toolkit/+bug/994002 # pt-online-schema-change 2.1.1 doesn't choose the PRIMARY KEY diff --git a/t/pt-online-schema-change/samples/bug-1336734.sql b/t/pt-online-schema-change/samples/bug-1336734.sql new file mode 100644 index 00000000..93a4d847 --- /dev/null +++ b/t/pt-online-schema-change/samples/bug-1336734.sql @@ -0,0 +1,11 @@ +drop database if exists test; +create database test; +use test; + +CREATE TABLE lp1336734 ( + id int primary key, + name varchar(20) DEFAULT NULL +); + +INSERT INTO lp1336734 VALUES (1, "curly"), (2, "larry") , (3, NULL), (4, "moe"); +