Merge lp:~percona-toolkit-dev/percona-toolkit/fix-sync-ignore-bug-1002365-2.0 into lp:percona-toolkit/2.0
- fix-sync-ignore-bug-1002365-2.0
- Merge into 2.0
Proposed by
Daniel Nichter
Status: | Merged |
---|---|
Merged at revision: | 245 |
Proposed branch: | lp:~percona-toolkit-dev/percona-toolkit/fix-sync-ignore-bug-1002365-2.0 |
Merge into: | lp:percona-toolkit/2.0 |
Diff against target: |
2885 lines (+1834/-520) 11 files modified
bin/pt-table-sync (+580/-423) lib/SchemaIterator.pm (+26/-44) lib/TableChecksum.pm (+1/-2) t/lib/SchemaIterator.t (+9/-50) t/lib/samples/SchemaIterator/all-dbs-tbls-5.0.txt (+421/-0) t/lib/samples/SchemaIterator/all-dbs-tbls.txt (+486/-0) t/lib/samples/SchemaIterator/resume-from-ignored-sakila-payment-5.0.txt (+52/-0) t/lib/samples/SchemaIterator/resume-from-ignored-sakila-payment.txt (+49/-0) t/lib/samples/SchemaIterator/resume-from-sakila-payment-5.0.txt (+70/-0) t/lib/samples/SchemaIterator/resume-from-sakila-payment.txt (+66/-0) t/pt-table-sync/filters.t (+74/-1) |
To merge this branch: | bzr merge lp:~percona-toolkit-dev/percona-toolkit/fix-sync-ignore-bug-1002365-2.0 |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Daniel Nichter | Approve | ||
Review via email: mp+108069@code.launchpad.net |
Commit message
Description of the change
To post a comment you must log in.
- 244. By Daniel Nichter
-
Update all modules in pt-table-sync.
Revision history for this message
Daniel Nichter (daniel-nichter) : | # |
review:
Approve
Preview Diff
[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1 | === modified file 'bin/pt-table-sync' | |||
2 | --- bin/pt-table-sync 2012-05-24 17:52:01 +0000 | |||
3 | +++ bin/pt-table-sync 2012-05-30 22:08:19 +0000 | |||
4 | @@ -959,7 +959,7 @@ | |||
5 | 959 | $opt->{value} = ($pre || '') . $num; | 959 | $opt->{value} = ($pre || '') . $num; |
6 | 960 | } | 960 | } |
7 | 961 | else { | 961 | else { |
9 | 962 | $self->save_error("Invalid size for --$opt->{long}"); | 962 | $self->save_error("Invalid size for --$opt->{long}: $val"); |
10 | 963 | } | 963 | } |
11 | 964 | return; | 964 | return; |
12 | 965 | } | 965 | } |
13 | @@ -1288,12 +1288,14 @@ | |||
14 | 1288 | sub as_string { | 1288 | sub as_string { |
15 | 1289 | my ( $self, $dsn, $props ) = @_; | 1289 | my ( $self, $dsn, $props ) = @_; |
16 | 1290 | return $dsn unless ref $dsn; | 1290 | return $dsn unless ref $dsn; |
18 | 1291 | my %allowed = $props ? map { $_=>1 } @$props : (); | 1291 | my @keys = $props ? @$props : sort keys %$dsn; |
19 | 1292 | return join(',', | 1292 | return join(',', |
24 | 1293 | map { "$_=" . ($_ eq 'p' ? '...' : $dsn->{$_}) } | 1293 | map { "$_=" . ($_ eq 'p' ? '...' : $dsn->{$_}) } |
25 | 1294 | grep { defined $dsn->{$_} && $self->{opts}->{$_} } | 1294 | grep { |
26 | 1295 | grep { !$props || $allowed{$_} } | 1295 | exists $self->{opts}->{$_} |
27 | 1296 | sort keys %$dsn ); | 1296 | && exists $dsn->{$_} |
28 | 1297 | && defined $dsn->{$_} | ||
29 | 1298 | } @keys); | ||
30 | 1297 | } | 1299 | } |
31 | 1298 | 1300 | ||
32 | 1299 | sub usage { | 1301 | sub usage { |
33 | @@ -1744,19 +1746,58 @@ | |||
34 | 1744 | return bless $self, $class; | 1746 | return bless $self, $class; |
35 | 1745 | } | 1747 | } |
36 | 1746 | 1748 | ||
37 | 1749 | sub get_create_table { | ||
38 | 1750 | my ( $self, $dbh, $db, $tbl ) = @_; | ||
39 | 1751 | die "I need a dbh parameter" unless $dbh; | ||
40 | 1752 | die "I need a db parameter" unless $db; | ||
41 | 1753 | die "I need a tbl parameter" unless $tbl; | ||
42 | 1754 | my $q = $self->{Quoter}; | ||
43 | 1755 | |||
44 | 1756 | my $new_sql_mode | ||
45 | 1757 | = '/*!40101 SET @OLD_SQL_MODE := @@SQL_MODE, ' | ||
46 | 1758 | . q{@@SQL_MODE := REPLACE(REPLACE(@@SQL_MODE, 'ANSI_QUOTES', ''), ',,', ','), } | ||
47 | 1759 | . '@OLD_QUOTE := @@SQL_QUOTE_SHOW_CREATE, ' | ||
48 | 1760 | . '@@SQL_QUOTE_SHOW_CREATE := 1 */'; | ||
49 | 1761 | |||
50 | 1762 | my $old_sql_mode = '/*!40101 SET @@SQL_MODE := @OLD_SQL_MODE, ' | ||
51 | 1763 | . '@@SQL_QUOTE_SHOW_CREATE := @OLD_QUOTE */'; | ||
52 | 1764 | |||
53 | 1765 | PTDEBUG && _d($new_sql_mode); | ||
54 | 1766 | eval { $dbh->do($new_sql_mode); }; | ||
55 | 1767 | PTDEBUG && $EVAL_ERROR && _d($EVAL_ERROR); | ||
56 | 1768 | |||
57 | 1769 | my $use_sql = 'USE ' . $q->quote($db); | ||
58 | 1770 | PTDEBUG && _d($dbh, $use_sql); | ||
59 | 1771 | $dbh->do($use_sql); | ||
60 | 1772 | |||
61 | 1773 | my $show_sql = "SHOW CREATE TABLE " . $q->quote($db, $tbl); | ||
62 | 1774 | PTDEBUG && _d($show_sql); | ||
63 | 1775 | my $href; | ||
64 | 1776 | eval { $href = $dbh->selectrow_hashref($show_sql); }; | ||
65 | 1777 | if ( $EVAL_ERROR ) { | ||
66 | 1778 | PTDEBUG && _d($EVAL_ERROR); | ||
67 | 1779 | |||
68 | 1780 | PTDEBUG && _d($old_sql_mode); | ||
69 | 1781 | $dbh->do($old_sql_mode); | ||
70 | 1782 | |||
71 | 1783 | return; | ||
72 | 1784 | } | ||
73 | 1785 | |||
74 | 1786 | PTDEBUG && _d($old_sql_mode); | ||
75 | 1787 | $dbh->do($old_sql_mode); | ||
76 | 1788 | |||
77 | 1789 | my ($key) = grep { m/create (?:table|view)/i } keys %$href; | ||
78 | 1790 | if ( !$key ) { | ||
79 | 1791 | die "Error: no 'Create Table' or 'Create View' in result set from " | ||
80 | 1792 | . "$show_sql: " . Dumper($href); | ||
81 | 1793 | } | ||
82 | 1794 | |||
83 | 1795 | return $href->{$key}; | ||
84 | 1796 | } | ||
85 | 1797 | |||
86 | 1747 | sub parse { | 1798 | sub parse { |
87 | 1748 | my ( $self, $ddl, $opts ) = @_; | 1799 | my ( $self, $ddl, $opts ) = @_; |
88 | 1749 | return unless $ddl; | 1800 | return unless $ddl; |
89 | 1750 | if ( ref $ddl eq 'ARRAY' ) { | ||
90 | 1751 | if ( lc $ddl->[0] eq 'table' ) { | ||
91 | 1752 | $ddl = $ddl->[1]; | ||
92 | 1753 | } | ||
93 | 1754 | else { | ||
94 | 1755 | return { | ||
95 | 1756 | engine => 'VIEW', | ||
96 | 1757 | }; | ||
97 | 1758 | } | ||
98 | 1759 | } | ||
99 | 1760 | 1801 | ||
100 | 1761 | if ( $ddl !~ m/CREATE (?:TEMPORARY )?TABLE `/ ) { | 1802 | if ( $ddl !~ m/CREATE (?:TEMPORARY )?TABLE `/ ) { |
101 | 1762 | die "Cannot parse table definition; is ANSI quoting " | 1803 | die "Cannot parse table definition; is ANSI quoting " |
102 | @@ -2063,41 +2104,31 @@ | |||
103 | 2063 | return $ddl; | 2104 | return $ddl; |
104 | 2064 | } | 2105 | } |
105 | 2065 | 2106 | ||
141 | 2066 | sub remove_secondary_indexes { | 2107 | sub get_table_status { |
142 | 2067 | my ( $self, $ddl ) = @_; | 2108 | my ( $self, $dbh, $db, $like ) = @_; |
143 | 2068 | my $sec_indexes_ddl; | 2109 | my $q = $self->{Quoter}; |
144 | 2069 | my $tbl_struct = $self->parse($ddl); | 2110 | my $sql = "SHOW TABLE STATUS FROM " . $q->quote($db); |
145 | 2070 | 2111 | my @params; | |
146 | 2071 | if ( ($tbl_struct->{engine} || '') =~ m/InnoDB/i ) { | 2112 | if ( $like ) { |
147 | 2072 | my $clustered_key = $tbl_struct->{clustered_key}; | 2113 | $sql .= ' LIKE ?'; |
148 | 2073 | $clustered_key ||= ''; | 2114 | push @params, $like; |
149 | 2074 | 2115 | } | |
150 | 2075 | my @sec_indexes = map { | 2116 | PTDEBUG && _d($sql, @params); |
151 | 2076 | my $key_def = $_->{ddl}; | 2117 | my $sth = $dbh->prepare($sql); |
152 | 2077 | $key_def =~ s/([\(\)])/\\$1/g; | 2118 | eval { $sth->execute(@params); }; |
153 | 2078 | $ddl =~ s/\s+$key_def//i; | 2119 | if ($EVAL_ERROR) { |
154 | 2079 | 2120 | PTDEBUG && _d($EVAL_ERROR); | |
155 | 2080 | my $key_ddl = "ADD $_->{ddl}"; | 2121 | return; |
156 | 2081 | $key_ddl .= ',' unless $key_ddl =~ m/,$/; | 2122 | } |
157 | 2082 | $key_ddl; | 2123 | my @tables = @{$sth->fetchall_arrayref({})}; |
158 | 2083 | } | 2124 | @tables = map { |
159 | 2084 | grep { $_->{name} ne $clustered_key } | 2125 | my %tbl; # Make a copy with lowercased keys |
160 | 2085 | values %{$tbl_struct->{keys}}; | 2126 | @tbl{ map { lc $_ } keys %$_ } = values %$_; |
161 | 2086 | PTDEBUG && _d('Secondary indexes:', Dumper(\@sec_indexes)); | 2127 | $tbl{engine} ||= $tbl{type} || $tbl{comment}; |
162 | 2087 | 2128 | delete $tbl{type}; | |
163 | 2088 | if ( @sec_indexes ) { | 2129 | \%tbl; |
164 | 2089 | $sec_indexes_ddl = join(' ', @sec_indexes); | 2130 | } @tables; |
165 | 2090 | $sec_indexes_ddl =~ s/,$//; | 2131 | return @tables; |
131 | 2091 | } | ||
132 | 2092 | |||
133 | 2093 | $ddl =~ s/,(\n\) )/$1/s; | ||
134 | 2094 | } | ||
135 | 2095 | else { | ||
136 | 2096 | PTDEBUG && _d('Not removing secondary indexes from', | ||
137 | 2097 | $tbl_struct->{engine}, 'table'); | ||
138 | 2098 | } | ||
139 | 2099 | |||
140 | 2100 | return $ddl, $sec_indexes_ddl, $tbl_struct; | ||
166 | 2101 | } | 2132 | } |
167 | 2102 | 2133 | ||
168 | 2103 | sub _d { | 2134 | sub _d { |
169 | @@ -4220,10 +4251,9 @@ | |||
170 | 4220 | . "FROM $table " | 4251 | . "FROM $table " |
171 | 4221 | . "WHERE master_cnt <> this_cnt OR master_crc <> this_crc " | 4252 | . "WHERE master_cnt <> this_cnt OR master_crc <> this_crc " |
172 | 4222 | . "OR ISNULL(master_crc) <> ISNULL(this_crc)"; | 4253 | . "OR ISNULL(master_crc) <> ISNULL(this_crc)"; |
173 | 4223 | |||
174 | 4224 | PTDEBUG && _d($sql); | 4254 | PTDEBUG && _d($sql); |
175 | 4225 | my $diffs = $dbh->selectall_arrayref($sql, { Slice => {} }); | 4255 | my $diffs = $dbh->selectall_arrayref($sql, { Slice => {} }); |
177 | 4226 | return @$diffs; | 4256 | return $diffs; |
178 | 4227 | } | 4257 | } |
179 | 4228 | 4258 | ||
180 | 4229 | sub _d { | 4259 | sub _d { |
181 | @@ -5448,11 +5478,12 @@ | |||
182 | 5448 | 5478 | ||
183 | 5449 | eval { | 5479 | eval { |
184 | 5450 | if ( my $timeout = $args{wait} ) { | 5480 | if ( my $timeout = $args{wait} ) { |
186 | 5451 | my $wait = $args{wait_retry_args}->{wait} || 10; | 5481 | my $ms = $self->{MasterSlave}; |
187 | 5452 | my $tries = $args{wait_retry_args}->{tries} || 3; | 5482 | my $tries = $args{wait_retry_args}->{tries} || 3; |
188 | 5483 | my $wait; | ||
189 | 5453 | $self->{Retry}->retry( | 5484 | $self->{Retry}->retry( |
190 | 5454 | wait => sub { sleep $wait; }, | ||
191 | 5455 | tries => $tries, | 5485 | tries => $tries, |
192 | 5486 | wait => sub { sleep $args{wait_retry_args}->{wait} || 10 }, | ||
193 | 5456 | try => sub { | 5487 | try => sub { |
194 | 5457 | my ( %args ) = @_; | 5488 | my ( %args ) = @_; |
195 | 5458 | 5489 | ||
196 | @@ -5460,12 +5491,18 @@ | |||
197 | 5460 | warn "Retrying MASTER_POS_WAIT() for --wait $timeout..."; | 5491 | warn "Retrying MASTER_POS_WAIT() for --wait $timeout..."; |
198 | 5461 | } | 5492 | } |
199 | 5462 | 5493 | ||
202 | 5463 | my $ms = $self->{MasterSlave}; | 5494 | $wait = $ms->wait_for_master( |
201 | 5464 | my $wait = $ms->wait_for_master( | ||
203 | 5465 | master_status => $ms->get_master_status($src->{misc_dbh}), | 5495 | master_status => $ms->get_master_status($src->{misc_dbh}), |
204 | 5466 | slave_dbh => $dst->{dbh}, | 5496 | slave_dbh => $dst->{dbh}, |
205 | 5467 | timeout => $timeout, | 5497 | timeout => $timeout, |
206 | 5468 | ); | 5498 | ); |
207 | 5499 | if ( defined $wait->{result} && $wait->{result} != -1 ) { | ||
208 | 5500 | return; # slave caught up | ||
209 | 5501 | } | ||
210 | 5502 | die; # call fail | ||
211 | 5503 | }, | ||
212 | 5504 | fail => sub { | ||
213 | 5505 | my (%args) = @_; | ||
214 | 5469 | if ( !defined $wait->{result} ) { | 5506 | if ( !defined $wait->{result} ) { |
215 | 5470 | my $msg; | 5507 | my $msg; |
216 | 5471 | if ( $wait->{waited} ) { | 5508 | if ( $wait->{waited} ) { |
217 | @@ -5480,20 +5517,14 @@ | |||
218 | 5480 | $msg .= " Sleeping $wait seconds then retrying " | 5517 | $msg .= " Sleeping $wait seconds then retrying " |
219 | 5481 | . ($tries - $args{tryno}) . " more times."; | 5518 | . ($tries - $args{tryno}) . " more times."; |
220 | 5482 | } | 5519 | } |
223 | 5483 | warn $msg; | 5520 | warn "$msg\n"; |
224 | 5484 | return; | 5521 | return 1; # call wait, call try |
225 | 5485 | } | 5522 | } |
226 | 5486 | elsif ( $wait->{result} == -1 ) { | 5523 | elsif ( $wait->{result} == -1 ) { |
234 | 5487 | die "Slave did not catch up to its master after waiting " | 5524 | return 0; # call final_fail |
228 | 5488 | . "$timeout seconds with MASTER_POS_WAIT. Try inceasing " | ||
229 | 5489 | . "the --wait time, or disable this feature by specifying " | ||
230 | 5490 | . "--wait 0."; | ||
231 | 5491 | } | ||
232 | 5492 | else { | ||
233 | 5493 | return $result; # slave caught up | ||
235 | 5494 | } | 5525 | } |
236 | 5495 | }, | 5526 | }, |
238 | 5496 | on_failure => sub { | 5527 | final_fail => sub { |
239 | 5497 | die "Slave did not catch up to its master after $tries attempts " | 5528 | die "Slave did not catch up to its master after $tries attempts " |
240 | 5498 | . "of waiting $timeout seconds with MASTER_POS_WAIT. " | 5529 | . "of waiting $timeout seconds with MASTER_POS_WAIT. " |
241 | 5499 | . "Check that the slave is running, increase the --wait " | 5530 | . "Check that the slave is running, increase the --wait " |
242 | @@ -5606,23 +5637,21 @@ | |||
243 | 5606 | die "I need a $arg argument" unless defined $args{$arg}; | 5637 | die "I need a $arg argument" unless defined $args{$arg}; |
244 | 5607 | } | 5638 | } |
245 | 5608 | my ($tbl_struct, $index) = @args{@required_args}; | 5639 | my ($tbl_struct, $index) = @args{@required_args}; |
247 | 5609 | my @cols = $args{cols} ? @{$args{cols}} : @{$tbl_struct->{cols}}; | 5640 | my @cols = $args{cols} ? @{$args{cols}} : @{$tbl_struct->{cols}}; |
248 | 5610 | my $q = $self->{Quoter}; | 5641 | my $q = $self->{Quoter}; |
249 | 5611 | 5642 | ||
250 | 5612 | die "Index '$index' does not exist in table" | 5643 | die "Index '$index' does not exist in table" |
251 | 5613 | unless exists $tbl_struct->{keys}->{$index}; | 5644 | unless exists $tbl_struct->{keys}->{$index}; |
252 | 5645 | PTDEBUG && _d('Will ascend index', $index); | ||
253 | 5614 | 5646 | ||
254 | 5615 | my @asc_cols = @{$tbl_struct->{keys}->{$index}->{cols}}; | 5647 | my @asc_cols = @{$tbl_struct->{keys}->{$index}->{cols}}; |
255 | 5616 | my @asc_slice; | ||
256 | 5617 | |||
257 | 5618 | @asc_cols = @{$tbl_struct->{keys}->{$index}->{cols}}; | ||
258 | 5619 | PTDEBUG && _d('Will ascend index', $index); | ||
259 | 5620 | PTDEBUG && _d('Will ascend columns', join(', ', @asc_cols)); | ||
260 | 5621 | if ( $args{asc_first} ) { | 5648 | if ( $args{asc_first} ) { |
261 | 5622 | @asc_cols = $asc_cols[0]; | 5649 | @asc_cols = $asc_cols[0]; |
262 | 5623 | PTDEBUG && _d('Ascending only first column'); | 5650 | PTDEBUG && _d('Ascending only first column'); |
263 | 5624 | } | 5651 | } |
264 | 5652 | PTDEBUG && _d('Will ascend columns', join(', ', @asc_cols)); | ||
265 | 5625 | 5653 | ||
266 | 5654 | my @asc_slice; | ||
267 | 5626 | my %col_posn = do { my $i = 0; map { $_ => $i++ } @cols }; | 5655 | my %col_posn = do { my $i = 0; map { $_ => $i++ } @cols }; |
268 | 5627 | foreach my $col ( @asc_cols ) { | 5656 | foreach my $col ( @asc_cols ) { |
269 | 5628 | if ( !exists $col_posn{$col} ) { | 5657 | if ( !exists $col_posn{$col} ) { |
270 | @@ -6723,292 +6752,427 @@ | |||
271 | 6723 | # ########################################################################### | 6752 | # ########################################################################### |
272 | 6724 | 6753 | ||
273 | 6725 | # ########################################################################### | 6754 | # ########################################################################### |
276 | 6726 | # SchemaIterator r7141 | 6755 | # SchemaIterator package |
277 | 6727 | # Don't update this package! | 6756 | # This package is a copy without comments from the original. The original |
278 | 6757 | # with comments and its test file can be found in the Bazaar repository at, | ||
279 | 6758 | # lib/SchemaIterator.pm | ||
280 | 6759 | # t/lib/SchemaIterator.t | ||
281 | 6760 | # See https://launchpad.net/percona-toolkit for more information. | ||
282 | 6728 | # ########################################################################### | 6761 | # ########################################################################### |
283 | 6762 | { | ||
284 | 6729 | package SchemaIterator; | 6763 | package SchemaIterator; |
285 | 6730 | 6764 | ||
286 | 6731 | use strict; | 6765 | use strict; |
287 | 6732 | use warnings FATAL => 'all'; | 6766 | use warnings FATAL => 'all'; |
288 | 6733 | |||
289 | 6734 | use English qw(-no_match_vars); | 6767 | use English qw(-no_match_vars); |
290 | 6768 | use constant PTDEBUG => $ENV{PTDEBUG} || 0; | ||
291 | 6769 | |||
292 | 6735 | use Data::Dumper; | 6770 | use Data::Dumper; |
293 | 6736 | $Data::Dumper::Indent = 1; | 6771 | $Data::Dumper::Indent = 1; |
294 | 6737 | $Data::Dumper::Sortkeys = 1; | 6772 | $Data::Dumper::Sortkeys = 1; |
295 | 6738 | $Data::Dumper::Quotekeys = 0; | 6773 | $Data::Dumper::Quotekeys = 0; |
296 | 6739 | 6774 | ||
298 | 6740 | use constant PTDEBUG => $ENV{PTDEBUG} || 0; | 6775 | my $open_comment = qr{/\*!\d{5} }; |
299 | 6776 | my $tbl_name = qr{ | ||
300 | 6777 | CREATE\s+ | ||
301 | 6778 | (?:TEMPORARY\s+)? | ||
302 | 6779 | TABLE\s+ | ||
303 | 6780 | (?:IF NOT EXISTS\s+)? | ||
304 | 6781 | ([^\(]+) | ||
305 | 6782 | }x; | ||
306 | 6783 | |||
307 | 6741 | 6784 | ||
308 | 6742 | sub new { | 6785 | sub new { |
309 | 6743 | my ( $class, %args ) = @_; | 6786 | my ( $class, %args ) = @_; |
311 | 6744 | foreach my $arg ( qw(Quoter) ) { | 6787 | my @required_args = qw(OptionParser TableParser Quoter); |
312 | 6788 | foreach my $arg ( @required_args ) { | ||
313 | 6745 | die "I need a $arg argument" unless $args{$arg}; | 6789 | die "I need a $arg argument" unless $args{$arg}; |
314 | 6746 | } | 6790 | } |
315 | 6791 | |||
316 | 6792 | my ($file_itr, $dbh) = @args{qw(file_itr dbh)}; | ||
317 | 6793 | die "I need either a dbh or file_itr argument" | ||
318 | 6794 | if (!$dbh && !$file_itr) || ($dbh && $file_itr); | ||
319 | 6795 | |||
320 | 6796 | my %resume; | ||
321 | 6797 | if ( my $table = $args{resume} ) { | ||
322 | 6798 | PTDEBUG && _d('Will resume from or after', $table); | ||
323 | 6799 | my ($db, $tbl) = $args{Quoter}->split_unquote($table); | ||
324 | 6800 | die "Resume table must be database-qualified: $table" | ||
325 | 6801 | unless $db && $tbl; | ||
326 | 6802 | $resume{db} = $db; | ||
327 | 6803 | $resume{tbl} = $tbl; | ||
328 | 6804 | } | ||
329 | 6805 | |||
330 | 6747 | my $self = { | 6806 | my $self = { |
331 | 6748 | %args, | 6807 | %args, |
334 | 6749 | filter => undef, | 6808 | resume => \%resume, |
335 | 6750 | dbs => [], | 6809 | filters => _make_filters(%args), |
336 | 6751 | }; | 6810 | }; |
337 | 6811 | |||
338 | 6752 | return bless $self, $class; | 6812 | return bless $self, $class; |
339 | 6753 | } | 6813 | } |
340 | 6754 | 6814 | ||
511 | 6755 | sub make_filter { | 6815 | sub _make_filters { |
512 | 6756 | my ( $self, $o ) = @_; | 6816 | my ( %args ) = @_; |
513 | 6757 | my @lines = ( | 6817 | my @required_args = qw(OptionParser Quoter); |
344 | 6758 | 'sub {', | ||
345 | 6759 | ' my ( $dbh, $db, $tbl ) = @_;', | ||
346 | 6760 | ' my $engine = undef;', | ||
347 | 6761 | ); | ||
348 | 6762 | |||
349 | 6763 | |||
350 | 6764 | my @permit_dbs = _make_filter('unless', '$db', $o->get('databases')) | ||
351 | 6765 | if $o->has('databases'); | ||
352 | 6766 | my @reject_dbs = _make_filter('if', '$db', $o->get('ignore-databases')) | ||
353 | 6767 | if $o->has('ignore-databases'); | ||
354 | 6768 | my @dbs_regex; | ||
355 | 6769 | if ( $o->has('databases-regex') && (my $p = $o->get('databases-regex')) ) { | ||
356 | 6770 | push @dbs_regex, " return 0 unless \$db && (\$db =~ m/$p/o);"; | ||
357 | 6771 | } | ||
358 | 6772 | my @reject_dbs_regex; | ||
359 | 6773 | if ( $o->has('ignore-databases-regex') | ||
360 | 6774 | && (my $p = $o->get('ignore-databases-regex')) ) { | ||
361 | 6775 | push @reject_dbs_regex, " return 0 if \$db && (\$db =~ m/$p/o);"; | ||
362 | 6776 | } | ||
363 | 6777 | if ( @permit_dbs || @reject_dbs || @dbs_regex || @reject_dbs_regex ) { | ||
364 | 6778 | push @lines, | ||
365 | 6779 | ' if ( $db ) {', | ||
366 | 6780 | (@permit_dbs ? @permit_dbs : ()), | ||
367 | 6781 | (@reject_dbs ? @reject_dbs : ()), | ||
368 | 6782 | (@dbs_regex ? @dbs_regex : ()), | ||
369 | 6783 | (@reject_dbs_regex ? @reject_dbs_regex : ()), | ||
370 | 6784 | ' }'; | ||
371 | 6785 | } | ||
372 | 6786 | |||
373 | 6787 | if ( $o->has('tables') || $o->has('ignore-tables') | ||
374 | 6788 | || $o->has('ignore-tables-regex') ) { | ||
375 | 6789 | |||
376 | 6790 | my $have_qtbl = 0; | ||
377 | 6791 | my $have_only_qtbls = 0; | ||
378 | 6792 | my %qtbls; | ||
379 | 6793 | |||
380 | 6794 | my @permit_tbls; | ||
381 | 6795 | my @permit_qtbls; | ||
382 | 6796 | my %permit_qtbls; | ||
383 | 6797 | if ( $o->get('tables') ) { | ||
384 | 6798 | my %tbls; | ||
385 | 6799 | map { | ||
386 | 6800 | if ( $_ =~ m/\./ ) { | ||
387 | 6801 | $permit_qtbls{$_} = 1; | ||
388 | 6802 | } | ||
389 | 6803 | else { | ||
390 | 6804 | $tbls{$_} = 1; | ||
391 | 6805 | } | ||
392 | 6806 | } keys %{ $o->get('tables') }; | ||
393 | 6807 | @permit_tbls = _make_filter('unless', '$tbl', \%tbls); | ||
394 | 6808 | @permit_qtbls = _make_filter('unless', '$qtbl', \%permit_qtbls); | ||
395 | 6809 | |||
396 | 6810 | if ( @permit_qtbls ) { | ||
397 | 6811 | push @lines, | ||
398 | 6812 | ' my $qtbl = ($db ? "$db." : "") . ($tbl ? $tbl : "");'; | ||
399 | 6813 | $have_qtbl = 1; | ||
400 | 6814 | } | ||
401 | 6815 | } | ||
402 | 6816 | |||
403 | 6817 | my @reject_tbls; | ||
404 | 6818 | my @reject_qtbls; | ||
405 | 6819 | my %reject_qtbls; | ||
406 | 6820 | if ( $o->get('ignore-tables') ) { | ||
407 | 6821 | my %tbls; | ||
408 | 6822 | map { | ||
409 | 6823 | if ( $_ =~ m/\./ ) { | ||
410 | 6824 | $reject_qtbls{$_} = 1; | ||
411 | 6825 | } | ||
412 | 6826 | else { | ||
413 | 6827 | $tbls{$_} = 1; | ||
414 | 6828 | } | ||
415 | 6829 | } keys %{ $o->get('ignore-tables') }; | ||
416 | 6830 | @reject_tbls= _make_filter('if', '$tbl', \%tbls); | ||
417 | 6831 | @reject_qtbls = _make_filter('if', '$qtbl', \%reject_qtbls); | ||
418 | 6832 | |||
419 | 6833 | if ( @reject_qtbls && !$have_qtbl ) { | ||
420 | 6834 | push @lines, | ||
421 | 6835 | ' my $qtbl = ($db ? "$db." : "") . ($tbl ? $tbl : "");'; | ||
422 | 6836 | } | ||
423 | 6837 | } | ||
424 | 6838 | |||
425 | 6839 | if ( keys %permit_qtbls && !@permit_dbs ) { | ||
426 | 6840 | my $dbs = {}; | ||
427 | 6841 | map { | ||
428 | 6842 | my ($db, undef) = split(/\./, $_); | ||
429 | 6843 | $dbs->{$db} = 1; | ||
430 | 6844 | } keys %permit_qtbls; | ||
431 | 6845 | PTDEBUG && _d('Adding restriction "--databases', | ||
432 | 6846 | (join(',', keys %$dbs) . '"')); | ||
433 | 6847 | if ( keys %$dbs ) { | ||
434 | 6848 | $o->set('databases', $dbs); | ||
435 | 6849 | return $self->make_filter($o); | ||
436 | 6850 | } | ||
437 | 6851 | } | ||
438 | 6852 | |||
439 | 6853 | my @tbls_regex; | ||
440 | 6854 | if ( $o->has('tables-regex') && (my $p = $o->get('tables-regex')) ) { | ||
441 | 6855 | push @tbls_regex, " return 0 unless \$tbl && (\$tbl =~ m/$p/o);"; | ||
442 | 6856 | } | ||
443 | 6857 | my @reject_tbls_regex; | ||
444 | 6858 | if ( $o->has('ignore-tables-regex') | ||
445 | 6859 | && (my $p = $o->get('ignore-tables-regex')) ) { | ||
446 | 6860 | push @reject_tbls_regex, | ||
447 | 6861 | " return 0 if \$tbl && (\$tbl =~ m/$p/o);"; | ||
448 | 6862 | } | ||
449 | 6863 | |||
450 | 6864 | my @get_eng; | ||
451 | 6865 | my @permit_engs; | ||
452 | 6866 | my @reject_engs; | ||
453 | 6867 | if ( ($o->has('engines') && $o->get('engines')) | ||
454 | 6868 | || ($o->has('ignore-engines') && $o->get('ignore-engines')) ) { | ||
455 | 6869 | push @get_eng, | ||
456 | 6870 | ' my $sql = "SHOW TABLE STATUS "', | ||
457 | 6871 | ' . ($db ? "FROM `$db`" : "")', | ||
458 | 6872 | ' . " LIKE \'$tbl\'";', | ||
459 | 6873 | ' PTDEBUG && _d($sql);', | ||
460 | 6874 | ' eval {', | ||
461 | 6875 | ' $engine = $dbh->selectrow_hashref($sql)->{engine};', | ||
462 | 6876 | ' };', | ||
463 | 6877 | ' PTDEBUG && $EVAL_ERROR && _d($EVAL_ERROR);', | ||
464 | 6878 | ' PTDEBUG && _d($tbl, "uses engine", $engine);', | ||
465 | 6879 | ' $engine = lc $engine if $engine;', | ||
466 | 6880 | @permit_engs | ||
467 | 6881 | = _make_filter('unless', '$engine', $o->get('engines'), 1); | ||
468 | 6882 | @reject_engs | ||
469 | 6883 | = _make_filter('if', '$engine', $o->get('ignore-engines'), 1) | ||
470 | 6884 | } | ||
471 | 6885 | |||
472 | 6886 | if ( @permit_tbls || @permit_qtbls || @reject_tbls || @tbls_regex | ||
473 | 6887 | || @reject_tbls_regex || @permit_engs || @reject_engs ) { | ||
474 | 6888 | push @lines, | ||
475 | 6889 | ' if ( $tbl ) {', | ||
476 | 6890 | (@permit_tbls ? @permit_tbls : ()), | ||
477 | 6891 | (@reject_tbls ? @reject_tbls : ()), | ||
478 | 6892 | (@tbls_regex ? @tbls_regex : ()), | ||
479 | 6893 | (@reject_tbls_regex ? @reject_tbls_regex : ()), | ||
480 | 6894 | (@permit_qtbls ? @permit_qtbls : ()), | ||
481 | 6895 | (@reject_qtbls ? @reject_qtbls : ()), | ||
482 | 6896 | (@get_eng ? @get_eng : ()), | ||
483 | 6897 | (@permit_engs ? @permit_engs : ()), | ||
484 | 6898 | (@reject_engs ? @reject_engs : ()), | ||
485 | 6899 | ' }'; | ||
486 | 6900 | } | ||
487 | 6901 | } | ||
488 | 6902 | |||
489 | 6903 | push @lines, | ||
490 | 6904 | ' PTDEBUG && _d(\'Passes filters:\', $db, $tbl, $engine, $dbh);', | ||
491 | 6905 | ' return 1;', '}'; | ||
492 | 6906 | |||
493 | 6907 | my $code = join("\n", @lines); | ||
494 | 6908 | PTDEBUG && _d('filter sub:', $code); | ||
495 | 6909 | my $filter_sub= eval $code | ||
496 | 6910 | or die "Error compiling subroutine code:\n$code\n$EVAL_ERROR"; | ||
497 | 6911 | |||
498 | 6912 | return $filter_sub; | ||
499 | 6913 | } | ||
500 | 6914 | |||
501 | 6915 | sub set_filter { | ||
502 | 6916 | my ( $self, $filter_sub ) = @_; | ||
503 | 6917 | $self->{filter} = $filter_sub; | ||
504 | 6918 | PTDEBUG && _d('Set filter sub'); | ||
505 | 6919 | return; | ||
506 | 6920 | } | ||
507 | 6921 | |||
508 | 6922 | sub get_db_itr { | ||
509 | 6923 | my ( $self, %args ) = @_; | ||
510 | 6924 | my @required_args = qw(dbh); | ||
514 | 6925 | foreach my $arg ( @required_args ) { | 6818 | foreach my $arg ( @required_args ) { |
515 | 6926 | die "I need a $arg argument" unless $args{$arg}; | 6819 | die "I need a $arg argument" unless $args{$arg}; |
516 | 6927 | } | 6820 | } |
522 | 6928 | my ($dbh) = @args{@required_args}; | 6821 | my ($o, $q) = @args{@required_args}; |
523 | 6929 | 6822 | ||
524 | 6930 | my $filter = $self->{filter}; | 6823 | my %filters; |
525 | 6931 | my @dbs; | 6824 | |
526 | 6932 | eval { | 6825 | |
527 | 6826 | my @simple_filters = qw( | ||
528 | 6827 | databases tables engines | ||
529 | 6828 | ignore-databases ignore-tables ignore-engines); | ||
530 | 6829 | FILTER: | ||
531 | 6830 | foreach my $filter ( @simple_filters ) { | ||
532 | 6831 | if ( $o->has($filter) ) { | ||
533 | 6832 | my $objs = $o->get($filter); | ||
534 | 6833 | next FILTER unless $objs && scalar keys %$objs; | ||
535 | 6834 | my $is_table = $filter =~ m/table/ ? 1 : 0; | ||
536 | 6835 | foreach my $obj ( keys %$objs ) { | ||
537 | 6836 | die "Undefined value for --$filter" unless $obj; | ||
538 | 6837 | $obj = lc $obj; | ||
539 | 6838 | if ( $is_table ) { | ||
540 | 6839 | my ($db, $tbl) = $q->split_unquote($obj); | ||
541 | 6840 | $db ||= '*'; | ||
542 | 6841 | PTDEBUG && _d('Filter', $filter, 'value:', $db, $tbl); | ||
543 | 6842 | $filters{$filter}->{$tbl} = $db; | ||
544 | 6843 | } | ||
545 | 6844 | else { # database | ||
546 | 6845 | PTDEBUG && _d('Filter', $filter, 'value:', $obj); | ||
547 | 6846 | $filters{$filter}->{$obj} = 1; | ||
548 | 6847 | } | ||
549 | 6848 | } | ||
550 | 6849 | } | ||
551 | 6850 | } | ||
552 | 6851 | |||
553 | 6852 | my @regex_filters = qw( | ||
554 | 6853 | databases-regex tables-regex | ||
555 | 6854 | ignore-databases-regex ignore-tables-regex); | ||
556 | 6855 | REGEX_FILTER: | ||
557 | 6856 | foreach my $filter ( @regex_filters ) { | ||
558 | 6857 | if ( $o->has($filter) ) { | ||
559 | 6858 | my $pat = $o->get($filter); | ||
560 | 6859 | next REGEX_FILTER unless $pat; | ||
561 | 6860 | $filters{$filter} = qr/$pat/; | ||
562 | 6861 | PTDEBUG && _d('Filter', $filter, 'value:', $filters{$filter}); | ||
563 | 6862 | } | ||
564 | 6863 | } | ||
565 | 6864 | |||
566 | 6865 | PTDEBUG && _d('Schema object filters:', Dumper(\%filters)); | ||
567 | 6866 | return \%filters; | ||
568 | 6867 | } | ||
569 | 6868 | |||
570 | 6869 | sub next { | ||
571 | 6870 | my ( $self ) = @_; | ||
572 | 6871 | |||
573 | 6872 | if ( !$self->{initialized} ) { | ||
574 | 6873 | $self->{initialized} = 1; | ||
575 | 6874 | if ( $self->{resume}->{tbl} | ||
576 | 6875 | && !$self->table_is_allowed(@{$self->{resume}}{qw(db tbl)}) ) { | ||
577 | 6876 | PTDEBUG && _d('Will resume after', | ||
578 | 6877 | join('.', @{$self->{resume}}{qw(db tbl)})); | ||
579 | 6878 | $self->{resume}->{after} = 1; | ||
580 | 6879 | } | ||
581 | 6880 | } | ||
582 | 6881 | |||
583 | 6882 | my $schema_obj; | ||
584 | 6883 | if ( $self->{file_itr} ) { | ||
585 | 6884 | $schema_obj= $self->_iterate_files(); | ||
586 | 6885 | } | ||
587 | 6886 | else { # dbh | ||
588 | 6887 | $schema_obj= $self->_iterate_dbh(); | ||
589 | 6888 | } | ||
590 | 6889 | |||
591 | 6890 | if ( $schema_obj ) { | ||
592 | 6891 | if ( my $schema = $self->{Schema} ) { | ||
593 | 6892 | $schema->add_schema_object($schema_obj); | ||
594 | 6893 | } | ||
595 | 6894 | PTDEBUG && _d('Next schema object:', | ||
596 | 6895 | $schema_obj->{db}, $schema_obj->{tbl}); | ||
597 | 6896 | } | ||
598 | 6897 | |||
599 | 6898 | return $schema_obj; | ||
600 | 6899 | } | ||
601 | 6900 | |||
602 | 6901 | sub _iterate_files { | ||
603 | 6902 | my ( $self ) = @_; | ||
604 | 6903 | |||
605 | 6904 | if ( !$self->{fh} ) { | ||
606 | 6905 | my ($fh, $file) = $self->{file_itr}->(); | ||
607 | 6906 | if ( !$fh ) { | ||
608 | 6907 | PTDEBUG && _d('No more files to iterate'); | ||
609 | 6908 | return; | ||
610 | 6909 | } | ||
611 | 6910 | $self->{fh} = $fh; | ||
612 | 6911 | $self->{file} = $file; | ||
613 | 6912 | } | ||
614 | 6913 | my $fh = $self->{fh}; | ||
615 | 6914 | PTDEBUG && _d('Getting next schema object from', $self->{file}); | ||
616 | 6915 | |||
617 | 6916 | local $INPUT_RECORD_SEPARATOR = ''; | ||
618 | 6917 | CHUNK: | ||
619 | 6918 | while (defined(my $chunk = <$fh>)) { | ||
620 | 6919 | if ($chunk =~ m/Database: (\S+)/) { | ||
621 | 6920 | my $db = $1; # XXX | ||
622 | 6921 | $db =~ s/^`//; # strip leading ` | ||
623 | 6922 | $db =~ s/`$//; # and trailing ` | ||
624 | 6923 | if ( $self->database_is_allowed($db) | ||
625 | 6924 | && $self->_resume_from_database($db) ) { | ||
626 | 6925 | $self->{db} = $db; | ||
627 | 6926 | } | ||
628 | 6927 | } | ||
629 | 6928 | elsif ($self->{db} && $chunk =~ m/CREATE TABLE/) { | ||
630 | 6929 | if ($chunk =~ m/DROP VIEW IF EXISTS/) { | ||
631 | 6930 | PTDEBUG && _d('Table is a VIEW, skipping'); | ||
632 | 6931 | next CHUNK; | ||
633 | 6932 | } | ||
634 | 6933 | |||
635 | 6934 | my ($tbl) = $chunk =~ m/$tbl_name/; | ||
636 | 6935 | $tbl =~ s/^\s*`//; | ||
637 | 6936 | $tbl =~ s/`\s*$//; | ||
638 | 6937 | if ( $self->_resume_from_table($tbl) | ||
639 | 6938 | && $self->table_is_allowed($self->{db}, $tbl) ) { | ||
640 | 6939 | my ($ddl) = $chunk =~ m/^(?:$open_comment)?(CREATE TABLE.+?;)$/ms; | ||
641 | 6940 | if ( !$ddl ) { | ||
642 | 6941 | warn "Failed to parse CREATE TABLE from\n" . $chunk; | ||
643 | 6942 | next CHUNK; | ||
644 | 6943 | } | ||
645 | 6944 | $ddl =~ s/ \*\/;\Z/;/; # remove end of version comment | ||
646 | 6945 | my $tbl_struct = $self->{TableParser}->parse($ddl); | ||
647 | 6946 | if ( $self->engine_is_allowed($tbl_struct->{engine}) ) { | ||
648 | 6947 | return { | ||
649 | 6948 | db => $self->{db}, | ||
650 | 6949 | tbl => $tbl, | ||
651 | 6950 | name => $self->{Quoter}->quote($self->{db}, $tbl), | ||
652 | 6951 | ddl => $ddl, | ||
653 | 6952 | tbl_struct => $tbl_struct, | ||
654 | 6953 | }; | ||
655 | 6954 | } | ||
656 | 6955 | } | ||
657 | 6956 | } | ||
658 | 6957 | } # CHUNK | ||
659 | 6958 | |||
660 | 6959 | PTDEBUG && _d('No more schema objects in', $self->{file}); | ||
661 | 6960 | close $self->{fh}; | ||
662 | 6961 | $self->{fh} = undef; | ||
663 | 6962 | |||
664 | 6963 | return $self->_iterate_files(); | ||
665 | 6964 | } | ||
666 | 6965 | |||
667 | 6966 | sub _iterate_dbh { | ||
668 | 6967 | my ( $self ) = @_; | ||
669 | 6968 | my $q = $self->{Quoter}; | ||
670 | 6969 | my $tp = $self->{TableParser}; | ||
671 | 6970 | my $dbh = $self->{dbh}; | ||
672 | 6971 | PTDEBUG && _d('Getting next schema object from dbh', $dbh); | ||
673 | 6972 | |||
674 | 6973 | if ( !defined $self->{dbs} ) { | ||
675 | 6933 | my $sql = 'SHOW DATABASES'; | 6974 | my $sql = 'SHOW DATABASES'; |
676 | 6934 | PTDEBUG && _d($sql); | 6975 | PTDEBUG && _d($sql); |
682 | 6935 | @dbs = grep { | 6976 | my @dbs = grep { $self->database_is_allowed($_) } |
683 | 6936 | my $ok = $filter ? $filter->($dbh, $_, undef) : 1; | 6977 | @{$dbh->selectcol_arrayref($sql)}; |
679 | 6937 | $ok = 0 if $_ =~ m/information_schema|performance_schema|lost\+found/; | ||
680 | 6938 | $ok; | ||
681 | 6939 | } @{ $dbh->selectcol_arrayref($sql) }; | ||
684 | 6940 | PTDEBUG && _d('Found', scalar @dbs, 'databases'); | 6978 | PTDEBUG && _d('Found', scalar @dbs, 'databases'); |
756 | 6941 | }; | 6979 | $self->{dbs} = \@dbs; |
757 | 6942 | 6980 | } | |
758 | 6943 | PTDEBUG && $EVAL_ERROR && _d($EVAL_ERROR); | 6981 | |
759 | 6944 | my $iterator = sub { | 6982 | if ( !$self->{db} ) { |
760 | 6945 | return shift @dbs; | 6983 | do { |
761 | 6946 | }; | 6984 | $self->{db} = shift @{$self->{dbs}}; |
762 | 6947 | 6985 | } until $self->_resume_from_database($self->{db}); | |
763 | 6948 | if (wantarray) { | 6986 | PTDEBUG && _d('Next database:', $self->{db}); |
764 | 6949 | return ($iterator, scalar @dbs); | 6987 | return unless $self->{db}; |
765 | 6950 | } | 6988 | } |
766 | 6951 | else { | 6989 | |
767 | 6952 | return $iterator; | 6990 | if ( !defined $self->{tbls} ) { |
768 | 6953 | } | 6991 | my $sql = 'SHOW /*!50002 FULL*/ TABLES FROM ' . $q->quote($self->{db}); |
769 | 6954 | } | 6992 | PTDEBUG && _d($sql); |
770 | 6955 | 6993 | my @tbls = map { | |
771 | 6956 | sub get_tbl_itr { | 6994 | $_->[0]; # (tbl, type) |
772 | 6957 | my ( $self, %args ) = @_; | 6995 | } |
773 | 6958 | my @required_args = qw(dbh db); | 6996 | grep { |
774 | 6959 | foreach my $arg ( @required_args ) { | 6997 | my ($tbl, $type) = @$_; |
775 | 6960 | die "I need a $arg argument" unless $args{$arg}; | 6998 | (!$type || ($type ne 'VIEW')) |
776 | 6961 | } | 6999 | && $self->_resume_from_table($tbl) |
777 | 6962 | my ($dbh, $db, $views) = @args{@required_args, 'views'}; | 7000 | && $self->table_is_allowed($self->{db}, $tbl); |
778 | 6963 | 7001 | } | |
779 | 6964 | my $filter = $self->{filter}; | 7002 | @{$dbh->selectall_arrayref($sql)}; |
780 | 6965 | my @tbls; | 7003 | PTDEBUG && _d('Found', scalar @tbls, 'tables in database', $self->{db}); |
781 | 6966 | if ( $db ) { | 7004 | $self->{tbls} = \@tbls; |
782 | 6967 | eval { | 7005 | } |
783 | 6968 | my $sql = 'SHOW /*!50002 FULL*/ TABLES FROM ' | 7006 | |
784 | 6969 | . $self->{Quoter}->quote($db); | 7007 | while ( my $tbl = shift @{$self->{tbls}} ) { |
785 | 6970 | PTDEBUG && _d($sql); | 7008 | my $ddl = $tp->get_create_table($dbh, $self->{db}, $tbl); |
786 | 6971 | @tbls = map { | 7009 | my $tbl_struct = $tp->parse($ddl); |
787 | 6972 | $_->[0] | 7010 | if ( $self->engine_is_allowed($tbl_struct->{engine}) ) { |
788 | 6973 | } | 7011 | return { |
789 | 6974 | grep { | 7012 | db => $self->{db}, |
790 | 6975 | my ($tbl, $type) = @$_; | 7013 | tbl => $tbl, |
791 | 6976 | my $ok = $filter ? $filter->($dbh, $db, $tbl) : 1; | 7014 | name => $q->quote($self->{db}, $tbl), |
792 | 6977 | if ( !$views ) { | 7015 | ddl => $ddl, |
793 | 6978 | $ok = 0 if ($type || '') eq 'VIEW'; | 7016 | tbl_struct => $tbl_struct, |
794 | 6979 | } | 7017 | }; |
795 | 6980 | $ok; | 7018 | } |
796 | 6981 | } | 7019 | } |
797 | 6982 | @{ $dbh->selectall_arrayref($sql) }; | 7020 | |
798 | 6983 | PTDEBUG && _d('Found', scalar @tbls, 'tables in', $db); | 7021 | PTDEBUG && _d('No more tables in database', $self->{db}); |
799 | 6984 | }; | 7022 | $self->{db} = undef; |
800 | 6985 | PTDEBUG && $EVAL_ERROR && _d($EVAL_ERROR); | 7023 | $self->{tbls} = undef; |
801 | 6986 | } | 7024 | |
802 | 6987 | else { | 7025 | return $self->_iterate_dbh(); |
803 | 6988 | PTDEBUG && _d('No db given so no tables'); | 7026 | } |
804 | 6989 | } | 7027 | |
805 | 6990 | 7028 | sub database_is_allowed { | |
806 | 6991 | my $iterator = sub { | 7029 | my ( $self, $db ) = @_; |
807 | 6992 | return shift @tbls; | 7030 | die "I need a db argument" unless $db; |
808 | 6993 | }; | 7031 | |
809 | 6994 | 7032 | $db = lc $db; | |
810 | 6995 | if ( wantarray ) { | 7033 | |
811 | 6996 | return ($iterator, scalar @tbls); | 7034 | my $filter = $self->{filters}; |
812 | 6997 | } | 7035 | |
813 | 6998 | else { | 7036 | if ( $db =~ m/information_schema|performance_schema|lost\+found/ ) { |
814 | 6999 | return $iterator; | 7037 | PTDEBUG && _d('Database', $db, 'is a system database, ignoring'); |
815 | 7000 | } | 7038 | return 0; |
816 | 7001 | } | 7039 | } |
817 | 7002 | 7040 | ||
818 | 7003 | sub _make_filter { | 7041 | if ( $self->{filters}->{'ignore-databases'}->{$db} ) { |
819 | 7004 | my ( $cond, $var_name, $objs, $lc ) = @_; | 7042 | PTDEBUG && _d('Database', $db, 'is in --ignore-databases list'); |
820 | 7005 | my @lines; | 7043 | return 0; |
821 | 7006 | if ( scalar keys %$objs ) { | 7044 | } |
822 | 7007 | my $test = join(' || ', | 7045 | |
823 | 7008 | map { "$var_name eq '" . ($lc ? lc $_ : $_) ."'" } keys %$objs); | 7046 | if ( $filter->{'ignore-databases-regex'} |
824 | 7009 | push @lines, " return 0 $cond $var_name && ($test);", | 7047 | && $db =~ $filter->{'ignore-databases-regex'} ) { |
825 | 7010 | } | 7048 | PTDEBUG && _d('Database', $db, 'matches --ignore-databases-regex'); |
826 | 7011 | return @lines; | 7049 | return 0; |
827 | 7050 | } | ||
828 | 7051 | |||
829 | 7052 | if ( $filter->{'databases'} | ||
830 | 7053 | && !$filter->{'databases'}->{$db} ) { | ||
831 | 7054 | PTDEBUG && _d('Database', $db, 'is not in --databases list, ignoring'); | ||
832 | 7055 | return 0; | ||
833 | 7056 | } | ||
834 | 7057 | |||
835 | 7058 | if ( $filter->{'databases-regex'} | ||
836 | 7059 | && $db !~ $filter->{'databases-regex'} ) { | ||
837 | 7060 | PTDEBUG && _d('Database', $db, 'does not match --databases-regex, ignoring'); | ||
838 | 7061 | return 0; | ||
839 | 7062 | } | ||
840 | 7063 | |||
841 | 7064 | return 1; | ||
842 | 7065 | } | ||
843 | 7066 | |||
844 | 7067 | sub table_is_allowed { | ||
845 | 7068 | my ( $self, $db, $tbl ) = @_; | ||
846 | 7069 | die "I need a db argument" unless $db; | ||
847 | 7070 | die "I need a tbl argument" unless $tbl; | ||
848 | 7071 | |||
849 | 7072 | $db = lc $db; | ||
850 | 7073 | $tbl = lc $tbl; | ||
851 | 7074 | |||
852 | 7075 | my $filter = $self->{filters}; | ||
853 | 7076 | |||
854 | 7077 | if ( $db eq 'mysql' && ($tbl eq 'general_log' || $tbl eq 'slow_log') ) { | ||
855 | 7078 | return 0; | ||
856 | 7079 | } | ||
857 | 7080 | |||
858 | 7081 | if ( $filter->{'ignore-tables'}->{$tbl} | ||
859 | 7082 | && ($filter->{'ignore-tables'}->{$tbl} eq '*' | ||
860 | 7083 | || $filter->{'ignore-tables'}->{$tbl} eq $db) ) { | ||
861 | 7084 | PTDEBUG && _d('Table', $tbl, 'is in --ignore-tables list'); | ||
862 | 7085 | return 0; | ||
863 | 7086 | } | ||
864 | 7087 | |||
865 | 7088 | if ( $filter->{'ignore-tables-regex'} | ||
866 | 7089 | && $tbl =~ $filter->{'ignore-tables-regex'} ) { | ||
867 | 7090 | PTDEBUG && _d('Table', $tbl, 'matches --ignore-tables-regex'); | ||
868 | 7091 | return 0; | ||
869 | 7092 | } | ||
870 | 7093 | |||
871 | 7094 | if ( $filter->{'tables'} | ||
872 | 7095 | && !$filter->{'tables'}->{$tbl} ) { | ||
873 | 7096 | PTDEBUG && _d('Table', $tbl, 'is not in --tables list, ignoring'); | ||
874 | 7097 | return 0; | ||
875 | 7098 | } | ||
876 | 7099 | |||
877 | 7100 | if ( $filter->{'tables-regex'} | ||
878 | 7101 | && $tbl !~ $filter->{'tables-regex'} ) { | ||
879 | 7102 | PTDEBUG && _d('Table', $tbl, 'does not match --tables-regex, ignoring'); | ||
880 | 7103 | return 0; | ||
881 | 7104 | } | ||
882 | 7105 | |||
883 | 7106 | if ( $filter->{'tables'} | ||
884 | 7107 | && $filter->{'tables'}->{$tbl} | ||
885 | 7108 | && $filter->{'tables'}->{$tbl} ne '*' | ||
886 | 7109 | && $filter->{'tables'}->{$tbl} ne $db ) { | ||
887 | 7110 | PTDEBUG && _d('Table', $tbl, 'is only allowed in database', | ||
888 | 7111 | $filter->{'tables'}->{$tbl}); | ||
889 | 7112 | return 0; | ||
890 | 7113 | } | ||
891 | 7114 | |||
892 | 7115 | return 1; | ||
893 | 7116 | } | ||
894 | 7117 | |||
895 | 7118 | sub engine_is_allowed { | ||
896 | 7119 | my ( $self, $engine ) = @_; | ||
897 | 7120 | |||
898 | 7121 | if ( !$engine ) { | ||
899 | 7122 | PTDEBUG && _d('No engine specified; allowing the table'); | ||
900 | 7123 | return 1; | ||
901 | 7124 | } | ||
902 | 7125 | |||
903 | 7126 | $engine = lc $engine; | ||
904 | 7127 | |||
905 | 7128 | my $filter = $self->{filters}; | ||
906 | 7129 | |||
907 | 7130 | if ( $filter->{'ignore-engines'}->{$engine} ) { | ||
908 | 7131 | PTDEBUG && _d('Engine', $engine, 'is in --ignore-databases list'); | ||
909 | 7132 | return 0; | ||
910 | 7133 | } | ||
911 | 7134 | |||
912 | 7135 | if ( $filter->{'engines'} | ||
913 | 7136 | && !$filter->{'engines'}->{$engine} ) { | ||
914 | 7137 | PTDEBUG && _d('Engine', $engine, 'is not in --engines list, ignoring'); | ||
915 | 7138 | return 0; | ||
916 | 7139 | } | ||
917 | 7140 | |||
918 | 7141 | return 1; | ||
919 | 7142 | } | ||
920 | 7143 | |||
921 | 7144 | sub _resume_from_database { | ||
922 | 7145 | my ($self, $db) = @_; | ||
923 | 7146 | |||
924 | 7147 | return 1 unless $self->{resume}->{db}; | ||
925 | 7148 | |||
926 | 7149 | if ( $db eq $self->{resume}->{db} ) { | ||
927 | 7150 | PTDEBUG && _d('At resume db', $db); | ||
928 | 7151 | delete $self->{resume}->{db}; | ||
929 | 7152 | return 1; | ||
930 | 7153 | } | ||
931 | 7154 | |||
932 | 7155 | return 0; | ||
933 | 7156 | } | ||
934 | 7157 | |||
935 | 7158 | sub _resume_from_table { | ||
936 | 7159 | my ($self, $tbl) = @_; | ||
937 | 7160 | |||
938 | 7161 | return 1 unless $self->{resume}->{tbl}; | ||
939 | 7162 | |||
940 | 7163 | if ( $tbl eq $self->{resume}->{tbl} ) { | ||
941 | 7164 | if ( !$self->{resume}->{after} ) { | ||
942 | 7165 | PTDEBUG && _d('Resuming from table', $tbl); | ||
943 | 7166 | delete $self->{resume}->{tbl}; | ||
944 | 7167 | return 1; | ||
945 | 7168 | } | ||
946 | 7169 | else { | ||
947 | 7170 | PTDEBUG && _d('Resuming after table', $tbl); | ||
948 | 7171 | delete $self->{resume}->{tbl}; | ||
949 | 7172 | } | ||
950 | 7173 | } | ||
951 | 7174 | |||
952 | 7175 | return 0; | ||
953 | 7012 | } | 7176 | } |
954 | 7013 | 7177 | ||
955 | 7014 | sub _d { | 7178 | sub _d { |
956 | @@ -7020,7 +7184,7 @@ | |||
957 | 7020 | } | 7184 | } |
958 | 7021 | 7185 | ||
959 | 7022 | 1; | 7186 | 1; |
961 | 7023 | 7187 | } | |
962 | 7024 | # ########################################################################### | 7188 | # ########################################################################### |
963 | 7025 | # End SchemaIterator package | 7189 | # End SchemaIterator package |
964 | 7026 | # ########################################################################### | 7190 | # ########################################################################### |
965 | @@ -7307,48 +7471,42 @@ | |||
966 | 7307 | 7471 | ||
967 | 7308 | sub retry { | 7472 | sub retry { |
968 | 7309 | my ( $self, %args ) = @_; | 7473 | my ( $self, %args ) = @_; |
970 | 7310 | my @required_args = qw(try wait); | 7474 | my @required_args = qw(try fail final_fail); |
971 | 7311 | foreach my $arg ( @required_args ) { | 7475 | foreach my $arg ( @required_args ) { |
972 | 7312 | die "I need a $arg argument" unless $args{$arg}; | 7476 | die "I need a $arg argument" unless $args{$arg}; |
973 | 7313 | }; | 7477 | }; |
975 | 7314 | my ($try, $wait) = @args{@required_args}; | 7478 | my ($try, $fail, $final_fail) = @args{@required_args}; |
976 | 7479 | my $wait = $args{wait} || sub { sleep 1; }; | ||
977 | 7315 | my $tries = $args{tries} || 3; | 7480 | my $tries = $args{tries} || 3; |
978 | 7316 | 7481 | ||
979 | 7482 | my $last_error; | ||
980 | 7317 | my $tryno = 0; | 7483 | my $tryno = 0; |
981 | 7484 | TRY: | ||
982 | 7318 | while ( ++$tryno <= $tries ) { | 7485 | while ( ++$tryno <= $tries ) { |
984 | 7319 | PTDEBUG && _d("Retry", $tryno, "of", $tries); | 7486 | PTDEBUG && _d("Try", $tryno, "of", $tries); |
985 | 7320 | my $result; | 7487 | my $result; |
986 | 7321 | eval { | 7488 | eval { |
987 | 7322 | $result = $try->(tryno=>$tryno); | 7489 | $result = $try->(tryno=>$tryno); |
988 | 7323 | }; | 7490 | }; |
989 | 7491 | if ( $EVAL_ERROR ) { | ||
990 | 7492 | PTDEBUG && _d("Try code failed:", $EVAL_ERROR); | ||
991 | 7493 | $last_error = $EVAL_ERROR; | ||
992 | 7324 | 7494 | ||
994 | 7325 | if ( defined $result ) { | 7495 | if ( $tryno < $tries ) { # more retries |
995 | 7496 | my $retry = $fail->(tryno=>$tryno, error=>$last_error); | ||
996 | 7497 | last TRY unless $retry; | ||
997 | 7498 | PTDEBUG && _d("Calling wait code"); | ||
998 | 7499 | $wait->(tryno=>$tryno); | ||
999 | 7500 | } | ||
1000 | 7501 | } | ||
1001 | 7502 | else { | ||
1002 | 7326 | PTDEBUG && _d("Try code succeeded"); | 7503 | PTDEBUG && _d("Try code succeeded"); |
1003 | 7327 | if ( my $on_success = $args{on_success} ) { | ||
1004 | 7328 | PTDEBUG && _d("Calling on_success code"); | ||
1005 | 7329 | $on_success->(tryno=>$tryno, result=>$result); | ||
1006 | 7330 | } | ||
1007 | 7331 | return $result; | 7504 | return $result; |
1008 | 7332 | } | 7505 | } |
1028 | 7333 | 7506 | } | |
1029 | 7334 | if ( $EVAL_ERROR ) { | 7507 | |
1030 | 7335 | PTDEBUG && _d("Try code died:", $EVAL_ERROR); | 7508 | PTDEBUG && _d('Try code did not succeed'); |
1031 | 7336 | die $EVAL_ERROR unless $args{retry_on_die}; | 7509 | return $final_fail->(error=>$last_error); |
1013 | 7337 | } | ||
1014 | 7338 | |||
1015 | 7339 | if ( $tryno < $tries ) { | ||
1016 | 7340 | PTDEBUG && _d("Try code failed, calling wait code"); | ||
1017 | 7341 | $wait->(tryno=>$tryno); | ||
1018 | 7342 | } | ||
1019 | 7343 | } | ||
1020 | 7344 | |||
1021 | 7345 | PTDEBUG && _d("Try code did not succeed"); | ||
1022 | 7346 | if ( my $on_failure = $args{on_failure} ) { | ||
1023 | 7347 | PTDEBUG && _d("Calling on_failure code"); | ||
1024 | 7348 | $on_failure->(); | ||
1025 | 7349 | } | ||
1026 | 7350 | |||
1027 | 7351 | return; | ||
1032 | 7352 | } | 7510 | } |
1033 | 7353 | 7511 | ||
1034 | 7354 | sub _d { | 7512 | sub _d { |
1035 | @@ -7824,11 +7982,16 @@ | |||
1036 | 7824 | tbl => undef, # set later | 7982 | tbl => undef, # set later |
1037 | 7825 | }; | 7983 | }; |
1038 | 7826 | 7984 | ||
1043 | 7827 | # Filters for --databases and --tables. We have to do these manually | 7985 | # Used to filter which tables are synced. |
1044 | 7828 | # since we don't use MySQLFind for --replicate. | 7986 | # https://bugs.launchpad.net/percona-toolkit/+bug/1002365 |
1045 | 7829 | my $databases = $o->get('databases'); | 7987 | my $schema_iter = new SchemaIterator( |
1046 | 7830 | my $tables = $o->get('tables'); | 7988 | dbh => $src->{dbh}, |
1047 | 7989 | OptionParser => $o, | ||
1048 | 7990 | TableParser => $args{TableParser}, | ||
1049 | 7991 | Quoter => $args{Quoter}, | ||
1050 | 7992 | ); | ||
1051 | 7831 | 7993 | ||
1052 | 7994 | my %skip_table; | ||
1053 | 7832 | my $exit_status = 0; | 7995 | my $exit_status = 0; |
1054 | 7833 | 7996 | ||
1055 | 7834 | # Connect to the master and treat it as the source, then find | 7997 | # Connect to the master and treat it as the source, then find |
1056 | @@ -7844,30 +8007,29 @@ | |||
1057 | 7844 | 8007 | ||
1058 | 7845 | # First, check that the master (source) has no discrepancies itself, | 8008 | # First, check that the master (source) has no discrepancies itself, |
1059 | 7846 | # and ignore tables that do. | 8009 | # and ignore tables that do. |
1064 | 7847 | my %skip_table; | 8010 | my $src_diffs = $checksum->find_replication_differences( |
1065 | 7848 | map { $skip_table{$_->{db}}->{$_->{tbl}}++ } | 8011 | $src->{dbh}, $o->get('replicate')); |
1066 | 7849 | $checksum->find_replication_differences( | 8012 | map { $skip_table{lc $_->{db}}->{lc $_->{tbl}}++ } @$src_diffs; |
1063 | 7850 | $src->{dbh}, $o->get('replicate')); | ||
1067 | 7851 | 8013 | ||
1068 | 7852 | # Now check the slave for differences and sync them if necessary. | 8014 | # Now check the slave for differences and sync them if necessary. |
1075 | 7853 | my @diffs = filter_diffs( | 8015 | my $dst_diffs = $checksum->find_replication_differences( |
1076 | 7854 | \%skip_table, | 8016 | $dst->{dbh}, $o->get('replicate')); |
1077 | 7855 | $databases, | 8017 | my $diffs = filter_diffs( |
1078 | 7856 | $tables, | 8018 | diffs => $dst_diffs, |
1079 | 7857 | $checksum->find_replication_differences( | 8019 | SchemaIterator => $schema_iter, |
1080 | 7858 | $dst->{dbh}, $o->get('replicate')) | 8020 | skip_table => \%skip_table, |
1081 | 7859 | ); | 8021 | ); |
1082 | 7860 | 8022 | ||
1083 | 7861 | if ( $o->get('verbose') ) { | 8023 | if ( $o->get('verbose') ) { |
1085 | 7862 | print_header("# Syncing via replication " . $dp->as_string($dst->{dsn}) | 8024 | print_header("# Syncing via replication " .$dp->as_string($dst->{dsn}) |
1086 | 7863 | . ($o->get('dry-run') ? | 8025 | . ($o->get('dry-run') ? |
1087 | 7864 | ' in dry-run mode, without accessing or comparing data' : '')); | 8026 | ' in dry-run mode, without accessing or comparing data' : '')); |
1088 | 7865 | } | 8027 | } |
1089 | 7866 | 8028 | ||
1091 | 7867 | if ( @diffs ) { | 8029 | if ( $diffs && scalar @$diffs ) { |
1092 | 7868 | lock_server(src => $src, dst => $dst, %args); | 8030 | lock_server(src => $src, dst => $dst, %args); |
1093 | 7869 | 8031 | ||
1095 | 7870 | foreach my $diff ( @diffs ) { | 8032 | foreach my $diff ( @$diffs ) { |
1096 | 7871 | $src->{db} = $dst->{db} = $diff->{db}; | 8033 | $src->{db} = $dst->{db} = $diff->{db}; |
1097 | 7872 | $src->{tbl} = $dst->{tbl} = $diff->{tbl}; | 8034 | $src->{tbl} = $dst->{tbl} = $diff->{tbl}; |
1098 | 7873 | 8035 | ||
1099 | @@ -7892,7 +8054,6 @@ | |||
1100 | 7892 | # The DSN is the master. Connect to each slave, find differences, | 8054 | # The DSN is the master. Connect to each slave, find differences, |
1101 | 7893 | # then sync them. | 8055 | # then sync them. |
1102 | 7894 | else { | 8056 | else { |
1103 | 7895 | my %skip_table; | ||
1104 | 7896 | $ms->recurse_to_slaves( | 8057 | $ms->recurse_to_slaves( |
1105 | 7897 | { dbh => $src->{dbh}, | 8058 | { dbh => $src->{dbh}, |
1106 | 7898 | dsn => $src->{dsn}, | 8059 | dsn => $src->{dsn}, |
1107 | @@ -7900,20 +8061,20 @@ | |||
1108 | 7900 | recurse => 1, | 8061 | recurse => 1, |
1109 | 7901 | callback => sub { | 8062 | callback => sub { |
1110 | 7902 | my ( $dsn, $dbh, $level, $parent ) = @_; | 8063 | my ( $dsn, $dbh, $level, $parent ) = @_; |
1113 | 7903 | my @diffs = $checksum | 8064 | my $all_diffs = $checksum->find_replication_differences( |
1114 | 7904 | ->find_replication_differences($dbh, $o->get('replicate')); | 8065 | $dbh, $o->get('replicate')); |
1115 | 7905 | if ( !$level ) { | 8066 | if ( !$level ) { |
1116 | 7906 | # This is the master; don't sync any tables that are wrong | 8067 | # This is the master; don't sync any tables that are wrong |
1117 | 7907 | # here, for obvious reasons. | 8068 | # here, for obvious reasons. |
1119 | 7908 | map { $skip_table{$_->{db}}->{$_->{tbl}}++ } @diffs; | 8069 | map { $skip_table{lc $_->{db}}->{lc $_->{tbl}}++ } |
1120 | 8070 | @$all_diffs; | ||
1121 | 7909 | } | 8071 | } |
1122 | 7910 | else { | 8072 | else { |
1123 | 7911 | # This is a slave. | 8073 | # This is a slave. |
1129 | 7912 | @diffs = filter_diffs( | 8074 | my $diffs = filter_diffs( |
1130 | 7913 | \%skip_table, | 8075 | diffs => $all_diffs, |
1131 | 7914 | $databases, | 8076 | SchemaIterator => $schema_iter, |
1132 | 7915 | $tables, | 8077 | skip_table => \%skip_table, |
1128 | 7916 | @diffs | ||
1133 | 7917 | ); | 8078 | ); |
1134 | 7918 | 8079 | ||
1135 | 7919 | if ( $o->get('verbose') ) { | 8080 | if ( $o->get('verbose') ) { |
1136 | @@ -7925,7 +8086,7 @@ | |||
1137 | 7925 | : '')); | 8086 | : '')); |
1138 | 7926 | } | 8087 | } |
1139 | 7927 | 8088 | ||
1141 | 7928 | if ( @diffs ) { | 8089 | if ( $diffs && scalar @$diffs ) { |
1142 | 7929 | my $dst = { | 8090 | my $dst = { |
1143 | 7930 | dsn => $dsn, | 8091 | dsn => $dsn, |
1144 | 7931 | dbh => $dbh, | 8092 | dbh => $dbh, |
1145 | @@ -7936,7 +8097,7 @@ | |||
1146 | 7936 | 8097 | ||
1147 | 7937 | lock_server(src => $src, dst => $dst, %args); | 8098 | lock_server(src => $src, dst => $dst, %args); |
1148 | 7938 | 8099 | ||
1150 | 7939 | foreach my $diff ( @diffs ) { | 8100 | foreach my $diff ( @$diffs ) { |
1151 | 7940 | $src->{db} = $dst->{db} = $diff->{db}; | 8101 | $src->{db} = $dst->{db} = $diff->{db}; |
1152 | 7941 | $src->{tbl} = $dst->{tbl} = $diff->{tbl}; | 8102 | $src->{tbl} = $dst->{tbl} = $diff->{tbl}; |
1153 | 7942 | 8103 | ||
1154 | @@ -8009,27 +8170,20 @@ | |||
1155 | 8009 | tbl => undef, # set later | 8170 | tbl => undef, # set later |
1156 | 8010 | }; | 8171 | }; |
1157 | 8011 | 8172 | ||
1160 | 8012 | my $si = new SchemaIterator( | 8173 | my $schema_iter = new SchemaIterator( |
1161 | 8013 | Quoter => $args{Quoter}, | 8174 | dbh => $src->{dbh}, |
1162 | 8175 | OptionParser => $o, | ||
1163 | 8176 | TableParser => $args{TableParser}, | ||
1164 | 8177 | Quoter => $args{Quoter}, | ||
1165 | 8014 | ); | 8178 | ); |
1166 | 8015 | $si->set_filter($si->make_filter($o)); | ||
1167 | 8016 | 8179 | ||
1168 | 8017 | # Make a list of all dbs.tbls on the source. It's more efficient this | 8180 | # Make a list of all dbs.tbls on the source. It's more efficient this |
1169 | 8018 | # way because it avoids open/closing a dbh for each tbl and dsn, unless | 8181 | # way because it avoids open/closing a dbh for each tbl and dsn, unless |
1170 | 8019 | # we pre-opened the dsn. It would also cause confusing verbose output. | 8182 | # we pre-opened the dsn. It would also cause confusing verbose output. |
1171 | 8020 | my @dbs_tbls; | 8183 | my @dbs_tbls; |
1184 | 8021 | my $next_db = $si->get_db_itr(dbh => $src->{dbh}); | 8184 | while ( my $tbl = $schema_iter->next() ) { |
1185 | 8022 | while ( my $db = $next_db->() ) { | 8185 | PTDEBUG && _d('Got table', $tbl->{db}, $tbl->{tbl}); |
1186 | 8023 | PTDEBUG && _d('Getting tables from', $db); | 8186 | push @dbs_tbls, $tbl; |
1175 | 8024 | my $next_tbl = $si->get_tbl_itr( | ||
1176 | 8025 | dbh => $src->{dbh}, | ||
1177 | 8026 | db => $db, | ||
1178 | 8027 | views => 0, | ||
1179 | 8028 | ); | ||
1180 | 8029 | while ( my $tbl = $next_tbl->() ) { | ||
1181 | 8030 | PTDEBUG && _d('Got table', $tbl); | ||
1182 | 8031 | push @dbs_tbls, { db => $db, tbl => $tbl }; | ||
1183 | 8032 | } | ||
1187 | 8033 | } | 8187 | } |
1188 | 8034 | 8188 | ||
1189 | 8035 | my $exit_status = 0; | 8189 | my $exit_status = 0; |
1190 | @@ -8578,19 +8732,16 @@ | |||
1191 | 8578 | # this isn't always the case. | 8732 | # this isn't always the case. |
1192 | 8579 | my $src_tbl_ddl; | 8733 | my $src_tbl_ddl; |
1193 | 8580 | eval { | 8734 | eval { |
1198 | 8581 | # FYI: get_create_table() does USE db but doesn't eval it. | 8735 | $src_tbl_ddl = $tp->get_create_table( |
1199 | 8582 | $src->{dbh}->do("USE `$src->{db}`"); | 8736 | $src->{dbh}, $src->{db}, $src->{tbl}); |
1196 | 8583 | $src_tbl_ddl = $du->get_create_table($src->{dbh}, $q, | ||
1197 | 8584 | $src->{db}, $src->{tbl}); | ||
1200 | 8585 | }; | 8737 | }; |
1201 | 8586 | die $EVAL_ERROR if $EVAL_ERROR; | 8738 | die $EVAL_ERROR if $EVAL_ERROR; |
1202 | 8587 | 8739 | ||
1203 | 8588 | my $dst_tbl_ddl; | 8740 | my $dst_tbl_ddl; |
1204 | 8589 | eval { | 8741 | eval { |
1205 | 8590 | # FYI: get_create_table() does USE db but doesn't eval it. | 8742 | # FYI: get_create_table() does USE db but doesn't eval it. |
1209 | 8591 | $dst->{dbh}->do("USE `$dst->{db}`"); | 8743 | $dst_tbl_ddl = $tp->get_create_table( |
1210 | 8592 | $dst_tbl_ddl = $du->get_create_table($dst->{dbh}, $q, | 8744 | $dst->{dbh}, $dst->{db}, $dst->{tbl}); |
1208 | 8593 | $dst->{db}, $dst->{tbl}); | ||
1211 | 8594 | }; | 8745 | }; |
1212 | 8595 | die $EVAL_ERROR if $EVAL_ERROR; | 8746 | die $EVAL_ERROR if $EVAL_ERROR; |
1213 | 8596 | 8747 | ||
1214 | @@ -8640,22 +8791,28 @@ | |||
1215 | 8640 | # filters. This sub is called in <sync_via_replication()> to implement | 8791 | # filters. This sub is called in <sync_via_replication()> to implement |
1216 | 8641 | # schema object filters like --databases and --tables. | 8792 | # schema object filters like --databases and --tables. |
1217 | 8642 | # | 8793 | # |
1218 | 8643 | # Parameters: | ||
1219 | 8644 | # $skip_table - Hashref of databases and tables to skip | ||
1220 | 8645 | # $databases - Hashref of databases to skip | ||
1221 | 8646 | # $tables - Hashref of tables to skip | ||
1222 | 8647 | # @diffs - Array of hashrefs, one for each different slave table | ||
1223 | 8648 | # | ||
1224 | 8649 | # Returns: | 8794 | # Returns: |
1226 | 8650 | # Array of different slave tables that pass the filters | 8795 | # Arrayref of different slave tables that pass the filters |
1227 | 8651 | sub filter_diffs { | 8796 | sub filter_diffs { |
1235 | 8652 | my ( $skip_table, $databases, $tables, @diffs ) = @_; | 8797 | my ( %args ) = @_; |
1236 | 8653 | return grep { | 8798 | my @required_args = qw(diffs SchemaIterator skip_table); |
1237 | 8654 | my ($db, $tbl) = $q->split_unquote($_->{table}); | 8799 | foreach my $arg ( @required_args ) { |
1238 | 8655 | !$skip_table->{$db}->{$tbl} | 8800 | die "I need a $arg argument" unless $args{$arg}; |
1239 | 8656 | && (!$databases || $databases->{$db}) | 8801 | } |
1240 | 8657 | && (!$tables || ($tables->{$tbl} || $tables->{$_->{table}})) | 8802 | my ($diffs, $si, $skip_table) = @args{@required_args}; |
1241 | 8658 | } @diffs; | 8803 | |
1242 | 8804 | my @filtered_diffs; | ||
1243 | 8805 | foreach my $diff ( @$diffs ) { | ||
1244 | 8806 | my $db = lc $diff->{db}; | ||
1245 | 8807 | my $tbl = lc $diff->{tbl}; | ||
1246 | 8808 | if ( !$skip_table->{$db}->{$tbl} | ||
1247 | 8809 | && $si->database_is_allowed($db) | ||
1248 | 8810 | && $si->table_is_allowed($db, $tbl) ) { | ||
1249 | 8811 | push @filtered_diffs, $diff; | ||
1250 | 8812 | } | ||
1251 | 8813 | } | ||
1252 | 8814 | |||
1253 | 8815 | return \@filtered_diffs; | ||
1254 | 8659 | } | 8816 | } |
1255 | 8660 | 8817 | ||
1256 | 8661 | # Sub: disconnect | 8818 | # Sub: disconnect |
1257 | 8662 | 8819 | ||
1258 | === modified file 'lib/SchemaIterator.pm' | |||
1259 | --- lib/SchemaIterator.pm 2012-01-19 19:46:56 +0000 | |||
1260 | +++ lib/SchemaIterator.pm 2012-05-30 22:08:19 +0000 | |||
1261 | @@ -55,12 +55,10 @@ | |||
1262 | 55 | # OptionParser - <OptionParser> object. All filters are gotten from this | 55 | # OptionParser - <OptionParser> object. All filters are gotten from this |
1263 | 56 | # obj: --databases, --tables, etc. | 56 | # obj: --databases, --tables, etc. |
1264 | 57 | # Quoter - <Quoter> object. | 57 | # Quoter - <Quoter> object. |
1265 | 58 | # TableParser - <TableParser> object get tbl_struct. | ||
1266 | 58 | # | 59 | # |
1267 | 59 | # Optional Arguments: | 60 | # Optional Arguments: |
1268 | 60 | # Schema - <Schema> object to initialize while iterating. | 61 | # Schema - <Schema> object to initialize while iterating. |
1269 | 61 | # TableParser - <TableParser> object get tbl_struct. | ||
1270 | 62 | # keep_ddl - Keep SHOW CREATE TABLE (default false). | ||
1271 | 63 | # keep_tbl_status - Keep SHOW TABLE STATUS (default false). | ||
1272 | 64 | # resume - Skip tables so first call to <next()> returns | 62 | # resume - Skip tables so first call to <next()> returns |
1273 | 65 | # this "db.table". | 63 | # this "db.table". |
1274 | 66 | # | 64 | # |
1275 | @@ -68,7 +66,7 @@ | |||
1276 | 68 | # SchemaIterator object | 66 | # SchemaIterator object |
1277 | 69 | sub new { | 67 | sub new { |
1278 | 70 | my ( $class, %args ) = @_; | 68 | my ( $class, %args ) = @_; |
1280 | 71 | my @required_args = qw(OptionParser Quoter); | 69 | my @required_args = qw(OptionParser TableParser Quoter); |
1281 | 72 | foreach my $arg ( @required_args ) { | 70 | foreach my $arg ( @required_args ) { |
1282 | 73 | die "I need a $arg argument" unless $args{$arg}; | 71 | die "I need a $arg argument" unless $args{$arg}; |
1283 | 74 | } | 72 | } |
1284 | @@ -222,18 +220,11 @@ | |||
1285 | 222 | } | 220 | } |
1286 | 223 | 221 | ||
1287 | 224 | if ( $schema_obj ) { | 222 | if ( $schema_obj ) { |
1288 | 225 | if ( $schema_obj->{ddl} && $self->{TableParser} ) { | ||
1289 | 226 | $schema_obj->{tbl_struct} | ||
1290 | 227 | = $self->{TableParser}->parse($schema_obj->{ddl}); | ||
1291 | 228 | } | ||
1292 | 229 | |||
1293 | 230 | delete $schema_obj->{ddl} unless $self->{keep_ddl}; | ||
1294 | 231 | delete $schema_obj->{tbl_status} unless $self->{keep_tbl_status}; | ||
1295 | 232 | |||
1296 | 233 | if ( my $schema = $self->{Schema} ) { | 223 | if ( my $schema = $self->{Schema} ) { |
1297 | 234 | $schema->add_schema_object($schema_obj); | 224 | $schema->add_schema_object($schema_obj); |
1298 | 235 | } | 225 | } |
1300 | 236 | PTDEBUG && _d('Next schema object:', $schema_obj->{db}, $schema_obj->{tbl}); | 226 | PTDEBUG && _d('Next schema object:', |
1301 | 227 | $schema_obj->{db}, $schema_obj->{tbl}); | ||
1302 | 237 | } | 228 | } |
1303 | 238 | 229 | ||
1304 | 239 | return $schema_obj; | 230 | return $schema_obj; |
1305 | @@ -295,14 +286,14 @@ | |||
1306 | 295 | next CHUNK; | 286 | next CHUNK; |
1307 | 296 | } | 287 | } |
1308 | 297 | $ddl =~ s/ \*\/;\Z/;/; # remove end of version comment | 288 | $ddl =~ s/ \*\/;\Z/;/; # remove end of version comment |
1313 | 298 | 289 | my $tbl_struct = $self->{TableParser}->parse($ddl); | |
1314 | 299 | my ($engine) = $ddl =~ m/\).*?(?:ENGINE|TYPE)=(\w+)/; | 290 | if ( $self->engine_is_allowed($tbl_struct->{engine}) ) { |
1311 | 300 | |||
1312 | 301 | if ( !$engine || $self->engine_is_allowed($engine) ) { | ||
1315 | 302 | return { | 291 | return { |
1319 | 303 | db => $self->{db}, | 292 | db => $self->{db}, |
1320 | 304 | tbl => $tbl, | 293 | tbl => $tbl, |
1321 | 305 | ddl => $ddl, | 294 | name => $self->{Quoter}->quote($self->{db}, $tbl), |
1322 | 295 | ddl => $ddl, | ||
1323 | 296 | tbl_struct => $tbl_struct, | ||
1324 | 306 | }; | 297 | }; |
1325 | 307 | } | 298 | } |
1326 | 308 | } | 299 | } |
1327 | @@ -321,6 +312,7 @@ | |||
1328 | 321 | sub _iterate_dbh { | 312 | sub _iterate_dbh { |
1329 | 322 | my ( $self ) = @_; | 313 | my ( $self ) = @_; |
1330 | 323 | my $q = $self->{Quoter}; | 314 | my $q = $self->{Quoter}; |
1331 | 315 | my $tp = $self->{TableParser}; | ||
1332 | 324 | my $dbh = $self->{dbh}; | 316 | my $dbh = $self->{dbh}; |
1333 | 325 | PTDEBUG && _d('Getting next schema object from dbh', $dbh); | 317 | PTDEBUG && _d('Getting next schema object from dbh', $dbh); |
1334 | 326 | 318 | ||
1335 | @@ -360,33 +352,15 @@ | |||
1336 | 360 | } | 352 | } |
1337 | 361 | 353 | ||
1338 | 362 | while ( my $tbl = shift @{$self->{tbls}} ) { | 354 | while ( my $tbl = shift @{$self->{tbls}} ) { |
1361 | 363 | # If there are engine filters, we have to get the table status. | 355 | my $ddl = $tp->get_create_table($dbh, $self->{db}, $tbl); |
1362 | 364 | # Else, get it if the user wants to keep it since they'll expect | 356 | my $tbl_struct = $tp->parse($ddl); |
1363 | 365 | # it to be available. | 357 | if ( $self->engine_is_allowed($tbl_struct->{engine}) ) { |
1342 | 366 | my $tbl_status; | ||
1343 | 367 | if ( $self->{filters}->{'engines'} | ||
1344 | 368 | || $self->{filters}->{'ignore-engines'} | ||
1345 | 369 | || $self->{keep_tbl_status} ) | ||
1346 | 370 | { | ||
1347 | 371 | my $sql = "SHOW TABLE STATUS FROM " . $q->quote($self->{db}) | ||
1348 | 372 | . " LIKE \'$tbl\'"; | ||
1349 | 373 | PTDEBUG && _d($sql); | ||
1350 | 374 | $tbl_status = $dbh->selectrow_hashref($sql); | ||
1351 | 375 | PTDEBUG && _d(Dumper($tbl_status)); | ||
1352 | 376 | } | ||
1353 | 377 | |||
1354 | 378 | if ( !$tbl_status | ||
1355 | 379 | || $self->engine_is_allowed($tbl_status->{engine}) ) { | ||
1356 | 380 | my $ddl; | ||
1357 | 381 | if ( my $tp = $self->{TableParser} ) { | ||
1358 | 382 | $ddl = $tp->get_create_table($dbh, $self->{db}, $tbl); | ||
1359 | 383 | } | ||
1360 | 384 | |||
1364 | 385 | return { | 358 | return { |
1365 | 386 | db => $self->{db}, | 359 | db => $self->{db}, |
1366 | 387 | tbl => $tbl, | 360 | tbl => $tbl, |
1367 | 361 | name => $q->quote($self->{db}, $tbl), | ||
1368 | 388 | ddl => $ddl, | 362 | ddl => $ddl, |
1370 | 389 | tbl_status => $tbl_status, | 363 | tbl_struct => $tbl_struct, |
1371 | 390 | }; | 364 | }; |
1372 | 391 | } | 365 | } |
1373 | 392 | } | 366 | } |
1374 | @@ -502,7 +476,15 @@ | |||
1375 | 502 | 476 | ||
1376 | 503 | sub engine_is_allowed { | 477 | sub engine_is_allowed { |
1377 | 504 | my ( $self, $engine ) = @_; | 478 | my ( $self, $engine ) = @_; |
1379 | 505 | die "I need an engine argument" unless $engine; | 479 | |
1380 | 480 | if ( !$engine ) { | ||
1381 | 481 | # This normally doesn't happen, but it can if the user | ||
1382 | 482 | # is iterating a file of their own table dumps, i.e. that | ||
1383 | 483 | # weren't created by mysqldump, so there's no ENGINE= | ||
1384 | 484 | # on the CREATE TABLE. | ||
1385 | 485 | PTDEBUG && _d('No engine specified; allowing the table'); | ||
1386 | 486 | return 1; | ||
1387 | 487 | } | ||
1388 | 506 | 488 | ||
1389 | 507 | $engine = lc $engine; | 489 | $engine = lc $engine; |
1390 | 508 | 490 | ||
1391 | 509 | 491 | ||
1392 | === modified file 'lib/TableChecksum.pm' | |||
1393 | --- lib/TableChecksum.pm 2012-01-19 19:46:56 +0000 | |||
1394 | +++ lib/TableChecksum.pm 2012-05-30 22:08:19 +0000 | |||
1395 | @@ -480,10 +480,9 @@ | |||
1396 | 480 | . "FROM $table " | 480 | . "FROM $table " |
1397 | 481 | . "WHERE master_cnt <> this_cnt OR master_crc <> this_crc " | 481 | . "WHERE master_cnt <> this_cnt OR master_crc <> this_crc " |
1398 | 482 | . "OR ISNULL(master_crc) <> ISNULL(this_crc)"; | 482 | . "OR ISNULL(master_crc) <> ISNULL(this_crc)"; |
1399 | 483 | |||
1400 | 484 | PTDEBUG && _d($sql); | 483 | PTDEBUG && _d($sql); |
1401 | 485 | my $diffs = $dbh->selectall_arrayref($sql, { Slice => {} }); | 484 | my $diffs = $dbh->selectall_arrayref($sql, { Slice => {} }); |
1403 | 486 | return @$diffs; | 485 | return $diffs; |
1404 | 487 | } | 486 | } |
1405 | 488 | 487 | ||
1406 | 489 | sub _d { | 488 | sub _d { |
1407 | 490 | 489 | ||
1408 | === modified file 't/lib/SchemaIterator.t' | |||
1409 | --- t/lib/SchemaIterator.t 2012-03-07 16:35:50 +0000 | |||
1410 | +++ t/lib/SchemaIterator.t 2012-05-30 22:08:19 +0000 | |||
1411 | @@ -9,7 +9,7 @@ | |||
1412 | 9 | use strict; | 9 | use strict; |
1413 | 10 | use warnings FATAL => 'all'; | 10 | use warnings FATAL => 'all'; |
1414 | 11 | use English qw(-no_match_vars); | 11 | use English qw(-no_match_vars); |
1416 | 12 | use Test::More tests => 31; | 12 | use Test::More tests => 29; |
1417 | 13 | 13 | ||
1418 | 14 | use SchemaIterator; | 14 | use SchemaIterator; |
1419 | 15 | use FileIterator; | 15 | use FileIterator; |
1420 | @@ -32,7 +32,7 @@ | |||
1421 | 32 | my $sb = new Sandbox(basedir => '/tmp', DSNParser => $dp); | 32 | my $sb = new Sandbox(basedir => '/tmp', DSNParser => $dp); |
1422 | 33 | my $dbh = $sb->get_dbh_for('master'); | 33 | my $dbh = $sb->get_dbh_for('master'); |
1423 | 34 | 34 | ||
1425 | 35 | my $tp; | 35 | my $tp = new TableParser(Quoter => $q); |
1426 | 36 | my $fi = new FileIterator(); | 36 | my $fi = new FileIterator(); |
1427 | 37 | my $o = new OptionParser(description => 'SchemaIterator'); | 37 | my $o = new OptionParser(description => 'SchemaIterator'); |
1428 | 38 | $o->get_specs("$trunk/bin/pt-table-checksum"); | 38 | $o->get_specs("$trunk/bin/pt-table-checksum"); |
1429 | @@ -55,7 +55,6 @@ | |||
1430 | 55 | my $file_itr = $fi->get_file_itr(@{$args{files}}); | 55 | my $file_itr = $fi->get_file_itr(@{$args{files}}); |
1431 | 56 | $si = new SchemaIterator( | 56 | $si = new SchemaIterator( |
1432 | 57 | file_itr => $file_itr, | 57 | file_itr => $file_itr, |
1433 | 58 | keep_ddl => defined $args{keep_ddl} ? $args{keep_ddl} : 1, | ||
1434 | 59 | resume => $args{resume}, | 58 | resume => $args{resume}, |
1435 | 60 | OptionParser => $o, | 59 | OptionParser => $o, |
1436 | 61 | Quoter => $q, | 60 | Quoter => $q, |
1437 | @@ -65,7 +64,6 @@ | |||
1438 | 65 | else { | 64 | else { |
1439 | 66 | $si = new SchemaIterator( | 65 | $si = new SchemaIterator( |
1440 | 67 | dbh => $dbh, | 66 | dbh => $dbh, |
1441 | 68 | keep_ddl => defined $args{keep_ddl} ? $args{keep_ddl} : 1, | ||
1442 | 69 | resume => $args{resume}, | 67 | resume => $args{resume}, |
1443 | 70 | OptionParser => $o, | 68 | OptionParser => $o, |
1444 | 71 | Quoter => $q, | 69 | Quoter => $q, |
1445 | @@ -132,7 +130,7 @@ | |||
1446 | 132 | # Test simple, unfiltered get_db_itr(). | 130 | # Test simple, unfiltered get_db_itr(). |
1447 | 133 | # ######################################################################## | 131 | # ######################################################################## |
1448 | 134 | test_so( | 132 | test_so( |
1450 | 135 | result => $sandbox_version eq '5.1' ? "$out/all-dbs-tbls.txt" | 133 | result => $sandbox_version ge '5.1' ? "$out/all-dbs-tbls.txt" |
1451 | 136 | : "$out/all-dbs-tbls-5.0.txt", | 134 | : "$out/all-dbs-tbls-5.0.txt", |
1452 | 137 | test_name => "Iterate all schema objects with dbh", | 135 | test_name => "Iterate all schema objects with dbh", |
1453 | 138 | ); | 136 | ); |
1454 | @@ -311,7 +309,6 @@ | |||
1455 | 311 | # ######################################################################## | 309 | # ######################################################################## |
1456 | 312 | # Getting CREATE TALBE (ddl). | 310 | # Getting CREATE TALBE (ddl). |
1457 | 313 | # ######################################################################## | 311 | # ######################################################################## |
1458 | 314 | $tp = new TableParser(Quoter => $q); | ||
1459 | 315 | test_so( | 312 | test_so( |
1460 | 316 | filters => [qw(-t mysql.user)], | 313 | filters => [qw(-t mysql.user)], |
1461 | 317 | result => $sandbox_version ge '5.1' ? "$out/mysql-user-ddl.txt" | 314 | result => $sandbox_version ge '5.1' ? "$out/mysql-user-ddl.txt" |
1462 | @@ -319,9 +316,6 @@ | |||
1463 | 319 | test_name => "Get CREATE TABLE with dbh", | 316 | test_name => "Get CREATE TABLE with dbh", |
1464 | 320 | ); | 317 | ); |
1465 | 321 | 318 | ||
1466 | 322 | # Kill the TableParser obj in case the next tests don't want to use it. | ||
1467 | 323 | $tp = undef; | ||
1468 | 324 | |||
1469 | 325 | $sb->wipe_clean($dbh); | 319 | $sb->wipe_clean($dbh); |
1470 | 326 | }; | 320 | }; |
1471 | 327 | 321 | ||
1472 | @@ -370,55 +364,18 @@ | |||
1473 | 370 | 364 | ||
1474 | 371 | is( | 365 | is( |
1475 | 372 | $n_tbl_structs, | 366 | $n_tbl_structs, |
1476 | 373 | 0, | ||
1477 | 374 | 'No tbl_struct without TableParser' | ||
1478 | 375 | ); | ||
1479 | 376 | |||
1480 | 377 | $tp = new TableParser(Quoter => $q); | ||
1481 | 378 | |||
1482 | 379 | $objs = test_so( | ||
1483 | 380 | files => ["$in/dump001.txt"], | ||
1484 | 381 | result => "", # hack to let return_objs work | ||
1485 | 382 | test_name => "", # hack to let return_objs work | ||
1486 | 383 | return_objs => 1, | ||
1487 | 384 | ); | ||
1488 | 385 | |||
1489 | 386 | $n_tbl_structs = grep { exists $_->{tbl_struct} } @$objs; | ||
1490 | 387 | |||
1491 | 388 | is( | ||
1492 | 389 | $n_tbl_structs, | ||
1493 | 390 | scalar @$objs, | 367 | scalar @$objs, |
1494 | 391 | 'Got tbl_struct for each schema object' | 368 | 'Got tbl_struct for each schema object' |
1495 | 392 | ); | 369 | ); |
1496 | 393 | 370 | ||
1497 | 394 | # Kill the TableParser obj in case the next tests don't want to use it. | ||
1498 | 395 | $tp = undef; | ||
1499 | 396 | |||
1500 | 397 | # ############################################################################ | ||
1501 | 398 | # keep_ddl | ||
1502 | 399 | # ############################################################################ | ||
1503 | 400 | $objs = test_so( | ||
1504 | 401 | files => ["$in/dump001.txt"], | ||
1505 | 402 | result => "", # hack to let return_objs work | ||
1506 | 403 | test_name => "", # hack to let return_objs work | ||
1507 | 404 | return_objs => 1, | ||
1508 | 405 | keep_ddl => 0, | ||
1509 | 406 | ); | ||
1510 | 407 | |||
1511 | 408 | my $n_ddls = grep { exists $_->{ddl} } @$objs; | ||
1512 | 409 | |||
1513 | 410 | is( | ||
1514 | 411 | $n_ddls, | ||
1515 | 412 | 0, | ||
1516 | 413 | 'DDL deleted unless keep_ddl' | ||
1517 | 414 | ); | ||
1518 | 415 | |||
1519 | 416 | # ############################################################################ | 371 | # ############################################################################ |
1520 | 417 | # Resume | 372 | # Resume |
1521 | 418 | # ############################################################################ | 373 | # ############################################################################ |
1522 | 419 | test_so( | 374 | test_so( |
1523 | 420 | filters => [qw(-d sakila)], | 375 | filters => [qw(-d sakila)], |
1525 | 421 | result => "$out/resume-from-sakila-payment.txt", | 376 | result => $sandbox_version ge '5.1' |
1526 | 377 | ? "$out/resume-from-sakila-payment.txt" | ||
1527 | 378 | : "$out/resume-from-sakila-payment-5.0.txt", | ||
1528 | 422 | resume => 'sakila.payment', | 379 | resume => 'sakila.payment', |
1529 | 423 | test_name => "Resume" | 380 | test_name => "Resume" |
1530 | 424 | ); | 381 | ); |
1531 | @@ -426,7 +383,9 @@ | |||
1532 | 426 | # Ignore the table being resumed from; resume from next table. | 383 | # Ignore the table being resumed from; resume from next table. |
1533 | 427 | test_so( | 384 | test_so( |
1534 | 428 | filters => [qw(-d sakila --ignore-tables sakila.payment)], | 385 | filters => [qw(-d sakila --ignore-tables sakila.payment)], |
1536 | 429 | result => "$out/resume-from-ignored-sakila-payment.txt", | 386 | result => $sandbox_version ge '5.1' |
1537 | 387 | ? "$out/resume-from-ignored-sakila-payment.txt" | ||
1538 | 388 | : "$out/resume-from-ignored-sakila-payment-5.0.txt", | ||
1539 | 430 | resume => 'sakila.payment', | 389 | resume => 'sakila.payment', |
1540 | 431 | test_name => "Resume from ignored table" | 390 | test_name => "Resume from ignored table" |
1541 | 432 | ); | 391 | ); |
1542 | 433 | 392 | ||
1543 | === modified file 't/lib/samples/SchemaIterator/all-dbs-tbls-5.0.txt' | |||
1544 | --- t/lib/samples/SchemaIterator/all-dbs-tbls-5.0.txt 2011-08-19 18:17:26 +0000 | |||
1545 | +++ t/lib/samples/SchemaIterator/all-dbs-tbls-5.0.txt 2012-05-30 22:08:19 +0000 | |||
1546 | @@ -1,33 +1,454 @@ | |||
1547 | 1 | mysql.columns_priv | 1 | mysql.columns_priv |
1548 | 2 | CREATE TABLE `columns_priv` ( | ||
1549 | 3 | `Host` char(60) collate utf8_bin NOT NULL default '', | ||
1550 | 4 | `Db` char(64) collate utf8_bin NOT NULL default '', | ||
1551 | 5 | `User` char(16) collate utf8_bin NOT NULL default '', | ||
1552 | 6 | `Table_name` char(64) collate utf8_bin NOT NULL default '', | ||
1553 | 7 | `Column_name` char(64) collate utf8_bin NOT NULL default '', | ||
1554 | 8 | `Timestamp` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP, | ||
1555 | 9 | `Column_priv` set('Select','Insert','Update','References') character set utf8 NOT NULL default '', | ||
1556 | 10 | PRIMARY KEY (`Host`,`Db`,`User`,`Table_name`,`Column_name`) | ||
1557 | 11 | ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='Column privileges' | ||
1558 | 12 | |||
1559 | 2 | mysql.db | 13 | mysql.db |
1560 | 14 | CREATE TABLE `db` ( | ||
1561 | 15 | `Host` char(60) collate utf8_bin NOT NULL default '', | ||
1562 | 16 | `Db` char(64) collate utf8_bin NOT NULL default '', | ||
1563 | 17 | `User` char(16) collate utf8_bin NOT NULL default '', | ||
1564 | 18 | `Select_priv` enum('N','Y') character set utf8 NOT NULL default 'N', | ||
1565 | 19 | `Insert_priv` enum('N','Y') character set utf8 NOT NULL default 'N', | ||
1566 | 20 | `Update_priv` enum('N','Y') character set utf8 NOT NULL default 'N', | ||
1567 | 21 | `Delete_priv` enum('N','Y') character set utf8 NOT NULL default 'N', | ||
1568 | 22 | `Create_priv` enum('N','Y') character set utf8 NOT NULL default 'N', | ||
1569 | 23 | `Drop_priv` enum('N','Y') character set utf8 NOT NULL default 'N', | ||
1570 | 24 | `Grant_priv` enum('N','Y') character set utf8 NOT NULL default 'N', | ||
1571 | 25 | `References_priv` enum('N','Y') character set utf8 NOT NULL default 'N', | ||
1572 | 26 | `Index_priv` enum('N','Y') character set utf8 NOT NULL default 'N', | ||
1573 | 27 | `Alter_priv` enum('N','Y') character set utf8 NOT NULL default 'N', | ||
1574 | 28 | `Create_tmp_table_priv` enum('N','Y') character set utf8 NOT NULL default 'N', | ||
1575 | 29 | `Lock_tables_priv` enum('N','Y') character set utf8 NOT NULL default 'N', | ||
1576 | 30 | `Create_view_priv` enum('N','Y') character set utf8 NOT NULL default 'N', | ||
1577 | 31 | `Show_view_priv` enum('N','Y') character set utf8 NOT NULL default 'N', | ||
1578 | 32 | `Create_routine_priv` enum('N','Y') character set utf8 NOT NULL default 'N', | ||
1579 | 33 | `Alter_routine_priv` enum('N','Y') character set utf8 NOT NULL default 'N', | ||
1580 | 34 | `Execute_priv` enum('N','Y') character set utf8 NOT NULL default 'N', | ||
1581 | 35 | PRIMARY KEY (`Host`,`Db`,`User`), | ||
1582 | 36 | KEY `User` (`User`) | ||
1583 | 37 | ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='Database privileges' | ||
1584 | 38 | |||
1585 | 3 | mysql.func | 39 | mysql.func |
1586 | 40 | CREATE TABLE `func` ( | ||
1587 | 41 | `name` char(64) collate utf8_bin NOT NULL default '', | ||
1588 | 42 | `ret` tinyint(1) NOT NULL default '0', | ||
1589 | 43 | `dl` char(128) collate utf8_bin NOT NULL default '', | ||
1590 | 44 | `type` enum('function','aggregate') character set utf8 NOT NULL, | ||
1591 | 45 | PRIMARY KEY (`name`) | ||
1592 | 46 | ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='User defined functions' | ||
1593 | 47 | |||
1594 | 4 | mysql.help_category | 48 | mysql.help_category |
1595 | 49 | CREATE TABLE `help_category` ( | ||
1596 | 50 | `help_category_id` smallint(5) unsigned NOT NULL, | ||
1597 | 51 | `name` char(64) NOT NULL, | ||
1598 | 52 | `parent_category_id` smallint(5) unsigned default NULL, | ||
1599 | 53 | `url` char(128) NOT NULL, | ||
1600 | 54 | PRIMARY KEY (`help_category_id`), | ||
1601 | 55 | UNIQUE KEY `name` (`name`) | ||
1602 | 56 | ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='help categories' | ||
1603 | 57 | |||
1604 | 5 | mysql.help_keyword | 58 | mysql.help_keyword |
1605 | 59 | CREATE TABLE `help_keyword` ( | ||
1606 | 60 | `help_keyword_id` int(10) unsigned NOT NULL, | ||
1607 | 61 | `name` char(64) NOT NULL, | ||
1608 | 62 | PRIMARY KEY (`help_keyword_id`), | ||
1609 | 63 | UNIQUE KEY `name` (`name`) | ||
1610 | 64 | ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='help keywords' | ||
1611 | 65 | |||
1612 | 6 | mysql.help_relation | 66 | mysql.help_relation |
1613 | 67 | CREATE TABLE `help_relation` ( | ||
1614 | 68 | `help_topic_id` int(10) unsigned NOT NULL, | ||
1615 | 69 | `help_keyword_id` int(10) unsigned NOT NULL, | ||
1616 | 70 | PRIMARY KEY (`help_keyword_id`,`help_topic_id`) | ||
1617 | 71 | ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='keyword-topic relation' | ||
1618 | 72 | |||
1619 | 7 | mysql.help_topic | 73 | mysql.help_topic |
1620 | 74 | CREATE TABLE `help_topic` ( | ||
1621 | 75 | `help_topic_id` int(10) unsigned NOT NULL, | ||
1622 | 76 | `name` char(64) NOT NULL, | ||
1623 | 77 | `help_category_id` smallint(5) unsigned NOT NULL, | ||
1624 | 78 | `description` text NOT NULL, | ||
1625 | 79 | `example` text NOT NULL, | ||
1626 | 80 | `url` char(128) NOT NULL, | ||
1627 | 81 | PRIMARY KEY (`help_topic_id`), | ||
1628 | 82 | UNIQUE KEY `name` (`name`) | ||
1629 | 83 | ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='help topics' | ||
1630 | 84 | |||
1631 | 8 | mysql.host | 85 | mysql.host |
1632 | 86 | CREATE TABLE `host` ( | ||
1633 | 87 | `Host` char(60) collate utf8_bin NOT NULL default '', | ||
1634 | 88 | `Db` char(64) collate utf8_bin NOT NULL default '', | ||
1635 | 89 | `Select_priv` enum('N','Y') character set utf8 NOT NULL default 'N', | ||
1636 | 90 | `Insert_priv` enum('N','Y') character set utf8 NOT NULL default 'N', | ||
1637 | 91 | `Update_priv` enum('N','Y') character set utf8 NOT NULL default 'N', | ||
1638 | 92 | `Delete_priv` enum('N','Y') character set utf8 NOT NULL default 'N', | ||
1639 | 93 | `Create_priv` enum('N','Y') character set utf8 NOT NULL default 'N', | ||
1640 | 94 | `Drop_priv` enum('N','Y') character set utf8 NOT NULL default 'N', | ||
1641 | 95 | `Grant_priv` enum('N','Y') character set utf8 NOT NULL default 'N', | ||
1642 | 96 | `References_priv` enum('N','Y') character set utf8 NOT NULL default 'N', | ||
1643 | 97 | `Index_priv` enum('N','Y') character set utf8 NOT NULL default 'N', | ||
1644 | 98 | `Alter_priv` enum('N','Y') character set utf8 NOT NULL default 'N', | ||
1645 | 99 | `Create_tmp_table_priv` enum('N','Y') character set utf8 NOT NULL default 'N', | ||
1646 | 100 | `Lock_tables_priv` enum('N','Y') character set utf8 NOT NULL default 'N', | ||
1647 | 101 | `Create_view_priv` enum('N','Y') character set utf8 NOT NULL default 'N', | ||
1648 | 102 | `Show_view_priv` enum('N','Y') character set utf8 NOT NULL default 'N', | ||
1649 | 103 | `Create_routine_priv` enum('N','Y') character set utf8 NOT NULL default 'N', | ||
1650 | 104 | `Alter_routine_priv` enum('N','Y') character set utf8 NOT NULL default 'N', | ||
1651 | 105 | `Execute_priv` enum('N','Y') character set utf8 NOT NULL default 'N', | ||
1652 | 106 | PRIMARY KEY (`Host`,`Db`) | ||
1653 | 107 | ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='Host privileges; Merged with database privileges' | ||
1654 | 108 | |||
1655 | 9 | mysql.proc | 109 | mysql.proc |
1656 | 110 | CREATE TABLE `proc` ( | ||
1657 | 111 | `db` char(64) character set utf8 collate utf8_bin NOT NULL default '', | ||
1658 | 112 | `name` char(64) NOT NULL default '', | ||
1659 | 113 | `type` enum('FUNCTION','PROCEDURE') NOT NULL, | ||
1660 | 114 | `specific_name` char(64) NOT NULL default '', | ||
1661 | 115 | `language` enum('SQL') NOT NULL default 'SQL', | ||
1662 | 116 | `sql_data_access` enum('CONTAINS_SQL','NO_SQL','READS_SQL_DATA','MODIFIES_SQL_DATA') NOT NULL default 'CONTAINS_SQL', | ||
1663 | 117 | `is_deterministic` enum('YES','NO') NOT NULL default 'NO', | ||
1664 | 118 | `security_type` enum('INVOKER','DEFINER') NOT NULL default 'DEFINER', | ||
1665 | 119 | `param_list` blob NOT NULL, | ||
1666 | 120 | `returns` char(64) NOT NULL default '', | ||
1667 | 121 | `body` longblob NOT NULL, | ||
1668 | 122 | `definer` char(77) character set utf8 collate utf8_bin NOT NULL default '', | ||
1669 | 123 | `created` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP, | ||
1670 | 124 | `modified` timestamp NOT NULL default '0000-00-00 00:00:00', | ||
1671 | 125 | `sql_mode` set('REAL_AS_FLOAT','PIPES_AS_CONCAT','ANSI_QUOTES','IGNORE_SPACE','NOT_USED','ONLY_FULL_GROUP_BY','NO_UNSIGNED_SUBTRACTION','NO_DIR_IN_CREATE','POSTGRESQL','ORACLE','MSSQL','DB2','MAXDB','NO_KEY_OPTIONS','NO_TABLE_OPTIONS','NO_FIELD_OPTIONS','MYSQL323','MYSQL40','ANSI','NO_AUTO_VALUE_ON_ZERO','NO_BACKSLASH_ESCAPES','STRICT_TRANS_TABLES','STRICT_ALL_TABLES','NO_ZERO_IN_DATE','NO_ZERO_DATE','INVALID_DATES','ERROR_FOR_DIVISION_BY_ZERO','TRADITIONAL','NO_AUTO_CREATE_USER','HIGH_NOT_PRECEDENCE') NOT NULL default '', | ||
1672 | 126 | `comment` char(64) character set utf8 collate utf8_bin NOT NULL default '', | ||
1673 | 127 | PRIMARY KEY (`db`,`name`,`type`) | ||
1674 | 128 | ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Stored Procedures' | ||
1675 | 129 | |||
1676 | 10 | mysql.procs_priv | 130 | mysql.procs_priv |
1677 | 131 | CREATE TABLE `procs_priv` ( | ||
1678 | 132 | `Host` char(60) collate utf8_bin NOT NULL default '', | ||
1679 | 133 | `Db` char(64) collate utf8_bin NOT NULL default '', | ||
1680 | 134 | `User` char(16) collate utf8_bin NOT NULL default '', | ||
1681 | 135 | `Routine_name` char(64) collate utf8_bin NOT NULL default '', | ||
1682 | 136 | `Routine_type` enum('FUNCTION','PROCEDURE') collate utf8_bin NOT NULL, | ||
1683 | 137 | `Grantor` char(77) collate utf8_bin NOT NULL default '', | ||
1684 | 138 | `Proc_priv` set('Execute','Alter Routine','Grant') character set utf8 NOT NULL default '', | ||
1685 | 139 | `Timestamp` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP, | ||
1686 | 140 | PRIMARY KEY (`Host`,`Db`,`User`,`Routine_name`,`Routine_type`), | ||
1687 | 141 | KEY `Grantor` (`Grantor`) | ||
1688 | 142 | ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='Procedure privileges' | ||
1689 | 143 | |||
1690 | 11 | mysql.tables_priv | 144 | mysql.tables_priv |
1691 | 145 | CREATE TABLE `tables_priv` ( | ||
1692 | 146 | `Host` char(60) collate utf8_bin NOT NULL default '', | ||
1693 | 147 | `Db` char(64) collate utf8_bin NOT NULL default '', | ||
1694 | 148 | `User` char(16) collate utf8_bin NOT NULL default '', | ||
1695 | 149 | `Table_name` char(64) collate utf8_bin NOT NULL default '', | ||
1696 | 150 | `Grantor` char(77) collate utf8_bin NOT NULL default '', | ||
1697 | 151 | `Timestamp` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP, | ||
1698 | 152 | `Table_priv` set('Select','Insert','Update','Delete','Create','Drop','Grant','References','Index','Alter','Create View','Show view') character set utf8 NOT NULL default '', | ||
1699 | 153 | `Column_priv` set('Select','Insert','Update','References') character set utf8 NOT NULL default '', | ||
1700 | 154 | PRIMARY KEY (`Host`,`Db`,`User`,`Table_name`), | ||
1701 | 155 | KEY `Grantor` (`Grantor`) | ||
1702 | 156 | ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='Table privileges' | ||
1703 | 157 | |||
1704 | 12 | mysql.time_zone | 158 | mysql.time_zone |
1705 | 159 | CREATE TABLE `time_zone` ( | ||
1706 | 160 | `Time_zone_id` int(10) unsigned NOT NULL auto_increment, | ||
1707 | 161 | `Use_leap_seconds` enum('Y','N') NOT NULL default 'N', | ||
1708 | 162 | PRIMARY KEY (`Time_zone_id`) | ||
1709 | 163 | ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Time zones' | ||
1710 | 164 | |||
1711 | 13 | mysql.time_zone_leap_second | 165 | mysql.time_zone_leap_second |
1712 | 166 | CREATE TABLE `time_zone_leap_second` ( | ||
1713 | 167 | `Transition_time` bigint(20) NOT NULL, | ||
1714 | 168 | `Correction` int(11) NOT NULL, | ||
1715 | 169 | PRIMARY KEY (`Transition_time`) | ||
1716 | 170 | ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Leap seconds information for time zones' | ||
1717 | 171 | |||
1718 | 14 | mysql.time_zone_name | 172 | mysql.time_zone_name |
1719 | 173 | CREATE TABLE `time_zone_name` ( | ||
1720 | 174 | `Name` char(64) NOT NULL, | ||
1721 | 175 | `Time_zone_id` int(10) unsigned NOT NULL, | ||
1722 | 176 | PRIMARY KEY (`Name`) | ||
1723 | 177 | ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Time zone names' | ||
1724 | 178 | |||
1725 | 15 | mysql.time_zone_transition | 179 | mysql.time_zone_transition |
1726 | 180 | CREATE TABLE `time_zone_transition` ( | ||
1727 | 181 | `Time_zone_id` int(10) unsigned NOT NULL, | ||
1728 | 182 | `Transition_time` bigint(20) NOT NULL, | ||
1729 | 183 | `Transition_type_id` int(10) unsigned NOT NULL, | ||
1730 | 184 | PRIMARY KEY (`Time_zone_id`,`Transition_time`) | ||
1731 | 185 | ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Time zone transitions' | ||
1732 | 186 | |||
1733 | 16 | mysql.time_zone_transition_type | 187 | mysql.time_zone_transition_type |
1734 | 188 | CREATE TABLE `time_zone_transition_type` ( | ||
1735 | 189 | `Time_zone_id` int(10) unsigned NOT NULL, | ||
1736 | 190 | `Transition_type_id` int(10) unsigned NOT NULL, | ||
1737 | 191 | `Offset` int(11) NOT NULL default '0', | ||
1738 | 192 | `Is_DST` tinyint(3) unsigned NOT NULL default '0', | ||
1739 | 193 | `Abbreviation` char(8) NOT NULL default '', | ||
1740 | 194 | PRIMARY KEY (`Time_zone_id`,`Transition_type_id`) | ||
1741 | 195 | ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Time zone transition types' | ||
1742 | 196 | |||
1743 | 17 | mysql.user | 197 | mysql.user |
1744 | 198 | CREATE TABLE `user` ( | ||
1745 | 199 | `Host` char(60) collate utf8_bin NOT NULL default '', | ||
1746 | 200 | `User` char(16) collate utf8_bin NOT NULL default '', | ||
1747 | 201 | `Password` char(41) character set latin1 collate latin1_bin NOT NULL default '', | ||
1748 | 202 | `Select_priv` enum('N','Y') character set utf8 NOT NULL default 'N', | ||
1749 | 203 | `Insert_priv` enum('N','Y') character set utf8 NOT NULL default 'N', | ||
1750 | 204 | `Update_priv` enum('N','Y') character set utf8 NOT NULL default 'N', | ||
1751 | 205 | `Delete_priv` enum('N','Y') character set utf8 NOT NULL default 'N', | ||
1752 | 206 | `Create_priv` enum('N','Y') character set utf8 NOT NULL default 'N', | ||
1753 | 207 | `Drop_priv` enum('N','Y') character set utf8 NOT NULL default 'N', | ||
1754 | 208 | `Reload_priv` enum('N','Y') character set utf8 NOT NULL default 'N', | ||
1755 | 209 | `Shutdown_priv` enum('N','Y') character set utf8 NOT NULL default 'N', | ||
1756 | 210 | `Process_priv` enum('N','Y') character set utf8 NOT NULL default 'N', | ||
1757 | 211 | `File_priv` enum('N','Y') character set utf8 NOT NULL default 'N', | ||
1758 | 212 | `Grant_priv` enum('N','Y') character set utf8 NOT NULL default 'N', | ||
1759 | 213 | `References_priv` enum('N','Y') character set utf8 NOT NULL default 'N', | ||
1760 | 214 | `Index_priv` enum('N','Y') character set utf8 NOT NULL default 'N', | ||
1761 | 215 | `Alter_priv` enum('N','Y') character set utf8 NOT NULL default 'N', | ||
1762 | 216 | `Show_db_priv` enum('N','Y') character set utf8 NOT NULL default 'N', | ||
1763 | 217 | `Super_priv` enum('N','Y') character set utf8 NOT NULL default 'N', | ||
1764 | 218 | `Create_tmp_table_priv` enum('N','Y') character set utf8 NOT NULL default 'N', | ||
1765 | 219 | `Lock_tables_priv` enum('N','Y') character set utf8 NOT NULL default 'N', | ||
1766 | 220 | `Execute_priv` enum('N','Y') character set utf8 NOT NULL default 'N', | ||
1767 | 221 | `Repl_slave_priv` enum('N','Y') character set utf8 NOT NULL default 'N', | ||
1768 | 222 | `Repl_client_priv` enum('N','Y') character set utf8 NOT NULL default 'N', | ||
1769 | 223 | `Create_view_priv` enum('N','Y') character set utf8 NOT NULL default 'N', | ||
1770 | 224 | `Show_view_priv` enum('N','Y') character set utf8 NOT NULL default 'N', | ||
1771 | 225 | `Create_routine_priv` enum('N','Y') character set utf8 NOT NULL default 'N', | ||
1772 | 226 | `Alter_routine_priv` enum('N','Y') character set utf8 NOT NULL default 'N', | ||
1773 | 227 | `Create_user_priv` enum('N','Y') character set utf8 NOT NULL default 'N', | ||
1774 | 228 | `ssl_type` enum('','ANY','X509','SPECIFIED') character set utf8 NOT NULL default '', | ||
1775 | 229 | `ssl_cipher` blob NOT NULL, | ||
1776 | 230 | `x509_issuer` blob NOT NULL, | ||
1777 | 231 | `x509_subject` blob NOT NULL, | ||
1778 | 232 | `max_questions` int(11) unsigned NOT NULL default '0', | ||
1779 | 233 | `max_updates` int(11) unsigned NOT NULL default '0', | ||
1780 | 234 | `max_connections` int(11) unsigned NOT NULL default '0', | ||
1781 | 235 | `max_user_connections` int(11) unsigned NOT NULL default '0', | ||
1782 | 236 | PRIMARY KEY (`Host`,`User`) | ||
1783 | 237 | ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='Users and global privileges' | ||
1784 | 238 | |||
1785 | 18 | sakila.actor | 239 | sakila.actor |
1786 | 240 | CREATE TABLE `actor` ( | ||
1787 | 241 | `actor_id` smallint(5) unsigned NOT NULL auto_increment, | ||
1788 | 242 | `first_name` varchar(45) NOT NULL, | ||
1789 | 243 | `last_name` varchar(45) NOT NULL, | ||
1790 | 244 | `last_update` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP, | ||
1791 | 245 | PRIMARY KEY (`actor_id`), | ||
1792 | 246 | KEY `idx_actor_last_name` (`last_name`) | ||
1793 | 247 | ) ENGINE=InnoDB AUTO_INCREMENT=201 DEFAULT CHARSET=utf8 | ||
1794 | 248 | |||
1795 | 19 | sakila.address | 249 | sakila.address |
1796 | 250 | CREATE TABLE `address` ( | ||
1797 | 251 | `address_id` smallint(5) unsigned NOT NULL auto_increment, | ||
1798 | 252 | `address` varchar(50) NOT NULL, | ||
1799 | 253 | `address2` varchar(50) default NULL, | ||
1800 | 254 | `district` varchar(20) NOT NULL, | ||
1801 | 255 | `city_id` smallint(5) unsigned NOT NULL, | ||
1802 | 256 | `postal_code` varchar(10) default NULL, | ||
1803 | 257 | `phone` varchar(20) NOT NULL, | ||
1804 | 258 | `last_update` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP, | ||
1805 | 259 | PRIMARY KEY (`address_id`), | ||
1806 | 260 | KEY `idx_fk_city_id` (`city_id`), | ||
1807 | 261 | CONSTRAINT `fk_address_city` FOREIGN KEY (`city_id`) REFERENCES `city` (`city_id`) ON UPDATE CASCADE | ||
1808 | 262 | ) ENGINE=InnoDB AUTO_INCREMENT=606 DEFAULT CHARSET=utf8 | ||
1809 | 263 | |||
1810 | 20 | sakila.category | 264 | sakila.category |
1811 | 265 | CREATE TABLE `category` ( | ||
1812 | 266 | `category_id` tinyint(3) unsigned NOT NULL auto_increment, | ||
1813 | 267 | `name` varchar(25) NOT NULL, | ||
1814 | 268 | `last_update` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP, | ||
1815 | 269 | PRIMARY KEY (`category_id`) | ||
1816 | 270 | ) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8 | ||
1817 | 271 | |||
1818 | 21 | sakila.city | 272 | sakila.city |
1819 | 273 | CREATE TABLE `city` ( | ||
1820 | 274 | `city_id` smallint(5) unsigned NOT NULL auto_increment, | ||
1821 | 275 | `city` varchar(50) NOT NULL, | ||
1822 | 276 | `country_id` smallint(5) unsigned NOT NULL, | ||
1823 | 277 | `last_update` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP, | ||
1824 | 278 | PRIMARY KEY (`city_id`), | ||
1825 | 279 | KEY `idx_fk_country_id` (`country_id`), | ||
1826 | 280 | CONSTRAINT `fk_city_country` FOREIGN KEY (`country_id`) REFERENCES `country` (`country_id`) ON UPDATE CASCADE | ||
1827 | 281 | ) ENGINE=InnoDB AUTO_INCREMENT=601 DEFAULT CHARSET=utf8 | ||
1828 | 282 | |||
1829 | 22 | sakila.country | 283 | sakila.country |
1830 | 284 | CREATE TABLE `country` ( | ||
1831 | 285 | `country_id` smallint(5) unsigned NOT NULL auto_increment, | ||
1832 | 286 | `country` varchar(50) NOT NULL, | ||
1833 | 287 | `last_update` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP, | ||
1834 | 288 | PRIMARY KEY (`country_id`) | ||
1835 | 289 | ) ENGINE=InnoDB AUTO_INCREMENT=110 DEFAULT CHARSET=utf8 | ||
1836 | 290 | |||
1837 | 23 | sakila.customer | 291 | sakila.customer |
1838 | 292 | CREATE TABLE `customer` ( | ||
1839 | 293 | `customer_id` smallint(5) unsigned NOT NULL auto_increment, | ||
1840 | 294 | `store_id` tinyint(3) unsigned NOT NULL, | ||
1841 | 295 | `first_name` varchar(45) NOT NULL, | ||
1842 | 296 | `last_name` varchar(45) NOT NULL, | ||
1843 | 297 | `email` varchar(50) default NULL, | ||
1844 | 298 | `address_id` smallint(5) unsigned NOT NULL, | ||
1845 | 299 | `active` tinyint(1) NOT NULL default '1', | ||
1846 | 300 | `create_date` datetime NOT NULL, | ||
1847 | 301 | `last_update` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP, | ||
1848 | 302 | PRIMARY KEY (`customer_id`), | ||
1849 | 303 | KEY `idx_fk_store_id` (`store_id`), | ||
1850 | 304 | KEY `idx_fk_address_id` (`address_id`), | ||
1851 | 305 | KEY `idx_last_name` (`last_name`), | ||
1852 | 306 | CONSTRAINT `fk_customer_address` FOREIGN KEY (`address_id`) REFERENCES `address` (`address_id`) ON UPDATE CASCADE, | ||
1853 | 307 | CONSTRAINT `fk_customer_store` FOREIGN KEY (`store_id`) REFERENCES `store` (`store_id`) ON UPDATE CASCADE | ||
1854 | 308 | ) ENGINE=InnoDB AUTO_INCREMENT=600 DEFAULT CHARSET=utf8 | ||
1855 | 309 | |||
1856 | 24 | sakila.film | 310 | sakila.film |
1857 | 311 | CREATE TABLE `film` ( | ||
1858 | 312 | `film_id` smallint(5) unsigned NOT NULL auto_increment, | ||
1859 | 313 | `title` varchar(255) NOT NULL, | ||
1860 | 314 | `description` text, | ||
1861 | 315 | `release_year` year(4) default NULL, | ||
1862 | 316 | `language_id` tinyint(3) unsigned NOT NULL, | ||
1863 | 317 | `original_language_id` tinyint(3) unsigned default NULL, | ||
1864 | 318 | `rental_duration` tinyint(3) unsigned NOT NULL default '3', | ||
1865 | 319 | `rental_rate` decimal(4,2) NOT NULL default '4.99', | ||
1866 | 320 | `length` smallint(5) unsigned default NULL, | ||
1867 | 321 | `replacement_cost` decimal(5,2) NOT NULL default '19.99', | ||
1868 | 322 | `rating` enum('G','PG','PG-13','R','NC-17') default 'G', | ||
1869 | 323 | `special_features` set('Trailers','Commentaries','Deleted Scenes','Behind the Scenes') default NULL, | ||
1870 | 324 | `last_update` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP, | ||
1871 | 325 | PRIMARY KEY (`film_id`), | ||
1872 | 326 | KEY `idx_title` (`title`), | ||
1873 | 327 | KEY `idx_fk_language_id` (`language_id`), | ||
1874 | 328 | KEY `idx_fk_original_language_id` (`original_language_id`), | ||
1875 | 329 | CONSTRAINT `fk_film_language` FOREIGN KEY (`language_id`) REFERENCES `language` (`language_id`) ON UPDATE CASCADE, | ||
1876 | 330 | CONSTRAINT `fk_film_language_original` FOREIGN KEY (`original_language_id`) REFERENCES `language` (`language_id`) ON UPDATE CASCADE | ||
1877 | 331 | ) ENGINE=InnoDB AUTO_INCREMENT=1001 DEFAULT CHARSET=utf8 | ||
1878 | 332 | |||
1879 | 25 | sakila.film_actor | 333 | sakila.film_actor |
1880 | 334 | CREATE TABLE `film_actor` ( | ||
1881 | 335 | `actor_id` smallint(5) unsigned NOT NULL, | ||
1882 | 336 | `film_id` smallint(5) unsigned NOT NULL, | ||
1883 | 337 | `last_update` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP, | ||
1884 | 338 | PRIMARY KEY (`actor_id`,`film_id`), | ||
1885 | 339 | KEY `idx_fk_film_id` (`film_id`), | ||
1886 | 340 | CONSTRAINT `fk_film_actor_actor` FOREIGN KEY (`actor_id`) REFERENCES `actor` (`actor_id`) ON UPDATE CASCADE, | ||
1887 | 341 | CONSTRAINT `fk_film_actor_film` FOREIGN KEY (`film_id`) REFERENCES `film` (`film_id`) ON UPDATE CASCADE | ||
1888 | 342 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8 | ||
1889 | 343 | |||
1890 | 26 | sakila.film_category | 344 | sakila.film_category |
1891 | 345 | CREATE TABLE `film_category` ( | ||
1892 | 346 | `film_id` smallint(5) unsigned NOT NULL, | ||
1893 | 347 | `category_id` tinyint(3) unsigned NOT NULL, | ||
1894 | 348 | `last_update` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP, | ||
1895 | 349 | PRIMARY KEY (`film_id`,`category_id`), | ||
1896 | 350 | KEY `fk_film_category_category` (`category_id`), | ||
1897 | 351 | CONSTRAINT `fk_film_category_film` FOREIGN KEY (`film_id`) REFERENCES `film` (`film_id`) ON UPDATE CASCADE, | ||
1898 | 352 | CONSTRAINT `fk_film_category_category` FOREIGN KEY (`category_id`) REFERENCES `category` (`category_id`) ON UPDATE CASCADE | ||
1899 | 353 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8 | ||
1900 | 354 | |||
1901 | 27 | sakila.film_text | 355 | sakila.film_text |
1902 | 356 | CREATE TABLE `film_text` ( | ||
1903 | 357 | `film_id` smallint(6) NOT NULL, | ||
1904 | 358 | `title` varchar(255) NOT NULL, | ||
1905 | 359 | `description` text, | ||
1906 | 360 | PRIMARY KEY (`film_id`), | ||
1907 | 361 | FULLTEXT KEY `idx_title_description` (`title`,`description`) | ||
1908 | 362 | ) ENGINE=MyISAM DEFAULT CHARSET=utf8 | ||
1909 | 363 | |||
1910 | 28 | sakila.inventory | 364 | sakila.inventory |
1911 | 365 | CREATE TABLE `inventory` ( | ||
1912 | 366 | `inventory_id` mediumint(8) unsigned NOT NULL auto_increment, | ||
1913 | 367 | `film_id` smallint(5) unsigned NOT NULL, | ||
1914 | 368 | `store_id` tinyint(3) unsigned NOT NULL, | ||
1915 | 369 | `last_update` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP, | ||
1916 | 370 | PRIMARY KEY (`inventory_id`), | ||
1917 | 371 | KEY `idx_fk_film_id` (`film_id`), | ||
1918 | 372 | KEY `idx_store_id_film_id` (`store_id`,`film_id`), | ||
1919 | 373 | CONSTRAINT `fk_inventory_store` FOREIGN KEY (`store_id`) REFERENCES `store` (`store_id`) ON UPDATE CASCADE, | ||
1920 | 374 | CONSTRAINT `fk_inventory_film` FOREIGN KEY (`film_id`) REFERENCES `film` (`film_id`) ON UPDATE CASCADE | ||
1921 | 375 | ) ENGINE=InnoDB AUTO_INCREMENT=4582 DEFAULT CHARSET=utf8 | ||
1922 | 376 | |||
1923 | 29 | sakila.language | 377 | sakila.language |
1924 | 378 | CREATE TABLE `language` ( | ||
1925 | 379 | `language_id` tinyint(3) unsigned NOT NULL auto_increment, | ||
1926 | 380 | `name` char(20) NOT NULL, | ||
1927 | 381 | `last_update` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP, | ||
1928 | 382 | PRIMARY KEY (`language_id`) | ||
1929 | 383 | ) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8 | ||
1930 | 384 | |||
1931 | 30 | sakila.payment | 385 | sakila.payment |
1932 | 386 | CREATE TABLE `payment` ( | ||
1933 | 387 | `payment_id` smallint(5) unsigned NOT NULL auto_increment, | ||
1934 | 388 | `customer_id` smallint(5) unsigned NOT NULL, | ||
1935 | 389 | `staff_id` tinyint(3) unsigned NOT NULL, | ||
1936 | 390 | `rental_id` int(11) default NULL, | ||
1937 | 391 | `amount` decimal(5,2) NOT NULL, | ||
1938 | 392 | `payment_date` datetime NOT NULL, | ||
1939 | 393 | `last_update` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP, | ||
1940 | 394 | PRIMARY KEY (`payment_id`), | ||
1941 | 395 | KEY `idx_fk_staff_id` (`staff_id`), | ||
1942 | 396 | KEY `idx_fk_customer_id` (`customer_id`), | ||
1943 | 397 | KEY `fk_payment_rental` (`rental_id`), | ||
1944 | 398 | CONSTRAINT `fk_payment_rental` FOREIGN KEY (`rental_id`) REFERENCES `rental` (`rental_id`) ON DELETE SET NULL ON UPDATE CASCADE, | ||
1945 | 399 | CONSTRAINT `fk_payment_customer` FOREIGN KEY (`customer_id`) REFERENCES `customer` (`customer_id`) ON UPDATE CASCADE, | ||
1946 | 400 | CONSTRAINT `fk_payment_staff` FOREIGN KEY (`staff_id`) REFERENCES `staff` (`staff_id`) ON UPDATE CASCADE | ||
1947 | 401 | ) ENGINE=InnoDB AUTO_INCREMENT=16050 DEFAULT CHARSET=utf8 | ||
1948 | 402 | |||
1949 | 31 | sakila.rental | 403 | sakila.rental |
1950 | 404 | CREATE TABLE `rental` ( | ||
1951 | 405 | `rental_id` int(11) NOT NULL auto_increment, | ||
1952 | 406 | `rental_date` datetime NOT NULL, | ||
1953 | 407 | `inventory_id` mediumint(8) unsigned NOT NULL, | ||
1954 | 408 | `customer_id` smallint(5) unsigned NOT NULL, | ||
1955 | 409 | `return_date` datetime default NULL, | ||
1956 | 410 | `staff_id` tinyint(3) unsigned NOT NULL, | ||
1957 | 411 | `last_update` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP, | ||
1958 | 412 | PRIMARY KEY (`rental_id`), | ||
1959 | 413 | UNIQUE KEY `rental_date` (`rental_date`,`inventory_id`,`customer_id`), | ||
1960 | 414 | KEY `idx_fk_inventory_id` (`inventory_id`), | ||
1961 | 415 | KEY `idx_fk_customer_id` (`customer_id`), | ||
1962 | 416 | KEY `idx_fk_staff_id` (`staff_id`), | ||
1963 | 417 | CONSTRAINT `fk_rental_staff` FOREIGN KEY (`staff_id`) REFERENCES `staff` (`staff_id`) ON UPDATE CASCADE, | ||
1964 | 418 | CONSTRAINT `fk_rental_inventory` FOREIGN KEY (`inventory_id`) REFERENCES `inventory` (`inventory_id`) ON UPDATE CASCADE, | ||
1965 | 419 | CONSTRAINT `fk_rental_customer` FOREIGN KEY (`customer_id`) REFERENCES `customer` (`customer_id`) ON UPDATE CASCADE | ||
1966 | 420 | ) ENGINE=InnoDB AUTO_INCREMENT=16050 DEFAULT CHARSET=utf8 | ||
1967 | 421 | |||
1968 | 32 | sakila.staff | 422 | sakila.staff |
1969 | 423 | CREATE TABLE `staff` ( | ||
1970 | 424 | `staff_id` tinyint(3) unsigned NOT NULL auto_increment, | ||
1971 | 425 | `first_name` varchar(45) NOT NULL, | ||
1972 | 426 | `last_name` varchar(45) NOT NULL, | ||
1973 | 427 | `address_id` smallint(5) unsigned NOT NULL, | ||
1974 | 428 | `picture` blob, | ||
1975 | 429 | `email` varchar(50) default NULL, | ||
1976 | 430 | `store_id` tinyint(3) unsigned NOT NULL, | ||
1977 | 431 | `active` tinyint(1) NOT NULL default '1', | ||
1978 | 432 | `username` varchar(16) NOT NULL, | ||
1979 | 433 | `password` varchar(40) character set utf8 collate utf8_bin default NULL, | ||
1980 | 434 | `last_update` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP, | ||
1981 | 435 | PRIMARY KEY (`staff_id`), | ||
1982 | 436 | KEY `idx_fk_store_id` (`store_id`), | ||
1983 | 437 | KEY `idx_fk_address_id` (`address_id`), | ||
1984 | 438 | CONSTRAINT `fk_staff_store` FOREIGN KEY (`store_id`) REFERENCES `store` (`store_id`) ON UPDATE CASCADE, | ||
1985 | 439 | CONSTRAINT `fk_staff_address` FOREIGN KEY (`address_id`) REFERENCES `address` (`address_id`) ON UPDATE CASCADE | ||
1986 | 440 | ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 | ||
1987 | 441 | |||
1988 | 33 | sakila.store | 442 | sakila.store |
1989 | 443 | CREATE TABLE `store` ( | ||
1990 | 444 | `store_id` tinyint(3) unsigned NOT NULL auto_increment, | ||
1991 | 445 | `manager_staff_id` tinyint(3) unsigned NOT NULL, | ||
1992 | 446 | `address_id` smallint(5) unsigned NOT NULL, | ||
1993 | 447 | `last_update` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP, | ||
1994 | 448 | PRIMARY KEY (`store_id`), | ||
1995 | 449 | UNIQUE KEY `idx_unique_manager` (`manager_staff_id`), | ||
1996 | 450 | KEY `idx_fk_address_id` (`address_id`), | ||
1997 | 451 | CONSTRAINT `fk_store_staff` FOREIGN KEY (`manager_staff_id`) REFERENCES `staff` (`staff_id`) ON UPDATE CASCADE, | ||
1998 | 452 | CONSTRAINT `fk_store_address` FOREIGN KEY (`address_id`) REFERENCES `address` (`address_id`) ON UPDATE CASCADE | ||
1999 | 453 | ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 | ||
2000 | 454 | |||
2001 | 34 | 455 | ||
2002 | === modified file 't/lib/samples/SchemaIterator/all-dbs-tbls.txt' | |||
2003 | --- t/lib/samples/SchemaIterator/all-dbs-tbls.txt 2011-09-23 14:07:03 +0000 | |||
2004 | +++ t/lib/samples/SchemaIterator/all-dbs-tbls.txt 2012-05-30 22:08:19 +0000 | |||
2005 | @@ -1,37 +1,523 @@ | |||
2006 | 1 | mysql.columns_priv | 1 | mysql.columns_priv |
2007 | 2 | CREATE TABLE `columns_priv` ( | ||
2008 | 3 | `Host` char(60) COLLATE utf8_bin NOT NULL DEFAULT '', | ||
2009 | 4 | `Db` char(64) COLLATE utf8_bin NOT NULL DEFAULT '', | ||
2010 | 5 | `User` char(16) COLLATE utf8_bin NOT NULL DEFAULT '', | ||
2011 | 6 | `Table_name` char(64) COLLATE utf8_bin NOT NULL DEFAULT '', | ||
2012 | 7 | `Column_name` char(64) COLLATE utf8_bin NOT NULL DEFAULT '', | ||
2013 | 8 | `Timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, | ||
2014 | 9 | `Column_priv` set('Select','Insert','Update','References') CHARACTER SET utf8 NOT NULL DEFAULT '', | ||
2015 | 10 | PRIMARY KEY (`Host`,`Db`,`User`,`Table_name`,`Column_name`) | ||
2016 | 11 | ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='Column privileges' | ||
2017 | 12 | |||
2018 | 2 | mysql.db | 13 | mysql.db |
2019 | 14 | CREATE TABLE `db` ( | ||
2020 | 15 | `Host` char(60) COLLATE utf8_bin NOT NULL DEFAULT '', | ||
2021 | 16 | `Db` char(64) COLLATE utf8_bin NOT NULL DEFAULT '', | ||
2022 | 17 | `User` char(16) COLLATE utf8_bin NOT NULL DEFAULT '', | ||
2023 | 18 | `Select_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', | ||
2024 | 19 | `Insert_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', | ||
2025 | 20 | `Update_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', | ||
2026 | 21 | `Delete_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', | ||
2027 | 22 | `Create_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', | ||
2028 | 23 | `Drop_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', | ||
2029 | 24 | `Grant_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', | ||
2030 | 25 | `References_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', | ||
2031 | 26 | `Index_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', | ||
2032 | 27 | `Alter_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', | ||
2033 | 28 | `Create_tmp_table_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', | ||
2034 | 29 | `Lock_tables_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', | ||
2035 | 30 | `Create_view_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', | ||
2036 | 31 | `Show_view_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', | ||
2037 | 32 | `Create_routine_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', | ||
2038 | 33 | `Alter_routine_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', | ||
2039 | 34 | `Execute_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', | ||
2040 | 35 | `Event_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', | ||
2041 | 36 | `Trigger_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', | ||
2042 | 37 | PRIMARY KEY (`Host`,`Db`,`User`), | ||
2043 | 38 | KEY `User` (`User`) | ||
2044 | 39 | ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='Database privileges' | ||
2045 | 40 | |||
2046 | 3 | mysql.event | 41 | mysql.event |
2047 | 42 | CREATE TABLE `event` ( | ||
2048 | 43 | `db` char(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '', | ||
2049 | 44 | `name` char(64) NOT NULL DEFAULT '', | ||
2050 | 45 | `body` longblob NOT NULL, | ||
2051 | 46 | `definer` char(77) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '', | ||
2052 | 47 | `execute_at` datetime DEFAULT NULL, | ||
2053 | 48 | `interval_value` int(11) DEFAULT NULL, | ||
2054 | 49 | `interval_field` enum('YEAR','QUARTER','MONTH','DAY','HOUR','MINUTE','WEEK','SECOND','MICROSECOND','YEAR_MONTH','DAY_HOUR','DAY_MINUTE','DAY_SECOND','HOUR_MINUTE','HOUR_SECOND','MINUTE_SECOND','DAY_MICROSECOND','HOUR_MICROSECOND','MINUTE_MICROSECOND','SECOND_MICROSECOND') DEFAULT NULL, | ||
2055 | 50 | `created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, | ||
2056 | 51 | `modified` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', | ||
2057 | 52 | `last_executed` datetime DEFAULT NULL, | ||
2058 | 53 | `starts` datetime DEFAULT NULL, | ||
2059 | 54 | `ends` datetime DEFAULT NULL, | ||
2060 | 55 | `status` enum('ENABLED','DISABLED','SLAVESIDE_DISABLED') NOT NULL DEFAULT 'ENABLED', | ||
2061 | 56 | `on_completion` enum('DROP','PRESERVE') NOT NULL DEFAULT 'DROP', | ||
2062 | 57 | `sql_mode` set('REAL_AS_FLOAT','PIPES_AS_CONCAT','ANSI_QUOTES','IGNORE_SPACE','NOT_USED','ONLY_FULL_GROUP_BY','NO_UNSIGNED_SUBTRACTION','NO_DIR_IN_CREATE','POSTGRESQL','ORACLE','MSSQL','DB2','MAXDB','NO_KEY_OPTIONS','NO_TABLE_OPTIONS','NO_FIELD_OPTIONS','MYSQL323','MYSQL40','ANSI','NO_AUTO_VALUE_ON_ZERO','NO_BACKSLASH_ESCAPES','STRICT_TRANS_TABLES','STRICT_ALL_TABLES','NO_ZERO_IN_DATE','NO_ZERO_DATE','INVALID_DATES','ERROR_FOR_DIVISION_BY_ZERO','TRADITIONAL','NO_AUTO_CREATE_USER','HIGH_NOT_PRECEDENCE','NO_ENGINE_SUBSTITUTION','PAD_CHAR_TO_FULL_LENGTH') NOT NULL DEFAULT '', | ||
2063 | 58 | `comment` char(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '', | ||
2064 | 59 | `originator` int(10) unsigned NOT NULL, | ||
2065 | 60 | `time_zone` char(64) CHARACTER SET latin1 NOT NULL DEFAULT 'SYSTEM', | ||
2066 | 61 | `character_set_client` char(32) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL, | ||
2067 | 62 | `collation_connection` char(32) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL, | ||
2068 | 63 | `db_collation` char(32) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL, | ||
2069 | 64 | `body_utf8` longblob, | ||
2070 | 65 | PRIMARY KEY (`db`,`name`) | ||
2071 | 66 | ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Events' | ||
2072 | 67 | |||
2073 | 4 | mysql.func | 68 | mysql.func |
2074 | 69 | CREATE TABLE `func` ( | ||
2075 | 70 | `name` char(64) COLLATE utf8_bin NOT NULL DEFAULT '', | ||
2076 | 71 | `ret` tinyint(1) NOT NULL DEFAULT '0', | ||
2077 | 72 | `dl` char(128) COLLATE utf8_bin NOT NULL DEFAULT '', | ||
2078 | 73 | `type` enum('function','aggregate') CHARACTER SET utf8 NOT NULL, | ||
2079 | 74 | PRIMARY KEY (`name`) | ||
2080 | 75 | ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='User defined functions' | ||
2081 | 76 | |||
2082 | 5 | mysql.help_category | 77 | mysql.help_category |
2083 | 78 | CREATE TABLE `help_category` ( | ||
2084 | 79 | `help_category_id` smallint(5) unsigned NOT NULL, | ||
2085 | 80 | `name` char(64) NOT NULL, | ||
2086 | 81 | `parent_category_id` smallint(5) unsigned DEFAULT NULL, | ||
2087 | 82 | `url` char(128) NOT NULL, | ||
2088 | 83 | PRIMARY KEY (`help_category_id`), | ||
2089 | 84 | UNIQUE KEY `name` (`name`) | ||
2090 | 85 | ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='help categories' | ||
2091 | 86 | |||
2092 | 6 | mysql.help_keyword | 87 | mysql.help_keyword |
2093 | 88 | CREATE TABLE `help_keyword` ( | ||
2094 | 89 | `help_keyword_id` int(10) unsigned NOT NULL, | ||
2095 | 90 | `name` char(64) NOT NULL, | ||
2096 | 91 | PRIMARY KEY (`help_keyword_id`), | ||
2097 | 92 | UNIQUE KEY `name` (`name`) | ||
2098 | 93 | ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='help keywords' | ||
2099 | 94 | |||
2100 | 7 | mysql.help_relation | 95 | mysql.help_relation |
2101 | 96 | CREATE TABLE `help_relation` ( | ||
2102 | 97 | `help_topic_id` int(10) unsigned NOT NULL, | ||
2103 | 98 | `help_keyword_id` int(10) unsigned NOT NULL, | ||
2104 | 99 | PRIMARY KEY (`help_keyword_id`,`help_topic_id`) | ||
2105 | 100 | ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='keyword-topic relation' | ||
2106 | 101 | |||
2107 | 8 | mysql.help_topic | 102 | mysql.help_topic |
2108 | 103 | CREATE TABLE `help_topic` ( | ||
2109 | 104 | `help_topic_id` int(10) unsigned NOT NULL, | ||
2110 | 105 | `name` char(64) NOT NULL, | ||
2111 | 106 | `help_category_id` smallint(5) unsigned NOT NULL, | ||
2112 | 107 | `description` text NOT NULL, | ||
2113 | 108 | `example` text NOT NULL, | ||
2114 | 109 | `url` char(128) NOT NULL, | ||
2115 | 110 | PRIMARY KEY (`help_topic_id`), | ||
2116 | 111 | UNIQUE KEY `name` (`name`) | ||
2117 | 112 | ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='help topics' | ||
2118 | 113 | |||
2119 | 9 | mysql.host | 114 | mysql.host |
2120 | 115 | CREATE TABLE `host` ( | ||
2121 | 116 | `Host` char(60) COLLATE utf8_bin NOT NULL DEFAULT '', | ||
2122 | 117 | `Db` char(64) COLLATE utf8_bin NOT NULL DEFAULT '', | ||
2123 | 118 | `Select_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', | ||
2124 | 119 | `Insert_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', | ||
2125 | 120 | `Update_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', | ||
2126 | 121 | `Delete_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', | ||
2127 | 122 | `Create_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', | ||
2128 | 123 | `Drop_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', | ||
2129 | 124 | `Grant_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', | ||
2130 | 125 | `References_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', | ||
2131 | 126 | `Index_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', | ||
2132 | 127 | `Alter_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', | ||
2133 | 128 | `Create_tmp_table_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', | ||
2134 | 129 | `Lock_tables_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', | ||
2135 | 130 | `Create_view_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', | ||
2136 | 131 | `Show_view_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', | ||
2137 | 132 | `Create_routine_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', | ||
2138 | 133 | `Alter_routine_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', | ||
2139 | 134 | `Execute_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', | ||
2140 | 135 | `Trigger_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', | ||
2141 | 136 | PRIMARY KEY (`Host`,`Db`) | ||
2142 | 137 | ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='Host privileges; Merged with database privileges' | ||
2143 | 138 | |||
2144 | 10 | mysql.ndb_binlog_index | 139 | mysql.ndb_binlog_index |
2145 | 140 | CREATE TABLE `ndb_binlog_index` ( | ||
2146 | 141 | `Position` bigint(20) unsigned NOT NULL, | ||
2147 | 142 | `File` varchar(255) NOT NULL, | ||
2148 | 143 | `epoch` bigint(20) unsigned NOT NULL, | ||
2149 | 144 | `inserts` bigint(20) unsigned NOT NULL, | ||
2150 | 145 | `updates` bigint(20) unsigned NOT NULL, | ||
2151 | 146 | `deletes` bigint(20) unsigned NOT NULL, | ||
2152 | 147 | `schemaops` bigint(20) unsigned NOT NULL, | ||
2153 | 148 | PRIMARY KEY (`epoch`) | ||
2154 | 149 | ) ENGINE=MyISAM DEFAULT CHARSET=latin1 | ||
2155 | 150 | |||
2156 | 11 | mysql.plugin | 151 | mysql.plugin |
2157 | 152 | CREATE TABLE `plugin` ( | ||
2158 | 153 | `name` char(64) COLLATE utf8_bin NOT NULL DEFAULT '', | ||
2159 | 154 | `dl` char(128) COLLATE utf8_bin NOT NULL DEFAULT '', | ||
2160 | 155 | PRIMARY KEY (`name`) | ||
2161 | 156 | ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='MySQL plugins' | ||
2162 | 157 | |||
2163 | 12 | mysql.proc | 158 | mysql.proc |
2164 | 159 | CREATE TABLE `proc` ( | ||
2165 | 160 | `db` char(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '', | ||
2166 | 161 | `name` char(64) NOT NULL DEFAULT '', | ||
2167 | 162 | `type` enum('FUNCTION','PROCEDURE') NOT NULL, | ||
2168 | 163 | `specific_name` char(64) NOT NULL DEFAULT '', | ||
2169 | 164 | `language` enum('SQL') NOT NULL DEFAULT 'SQL', | ||
2170 | 165 | `sql_data_access` enum('CONTAINS_SQL','NO_SQL','READS_SQL_DATA','MODIFIES_SQL_DATA') NOT NULL DEFAULT 'CONTAINS_SQL', | ||
2171 | 166 | `is_deterministic` enum('YES','NO') NOT NULL DEFAULT 'NO', | ||
2172 | 167 | `security_type` enum('INVOKER','DEFINER') NOT NULL DEFAULT 'DEFINER', | ||
2173 | 168 | `param_list` blob NOT NULL, | ||
2174 | 169 | `returns` longblob NOT NULL, | ||
2175 | 170 | `body` longblob NOT NULL, | ||
2176 | 171 | `definer` char(77) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '', | ||
2177 | 172 | `created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, | ||
2178 | 173 | `modified` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', | ||
2179 | 174 | `sql_mode` set('REAL_AS_FLOAT','PIPES_AS_CONCAT','ANSI_QUOTES','IGNORE_SPACE','NOT_USED','ONLY_FULL_GROUP_BY','NO_UNSIGNED_SUBTRACTION','NO_DIR_IN_CREATE','POSTGRESQL','ORACLE','MSSQL','DB2','MAXDB','NO_KEY_OPTIONS','NO_TABLE_OPTIONS','NO_FIELD_OPTIONS','MYSQL323','MYSQL40','ANSI','NO_AUTO_VALUE_ON_ZERO','NO_BACKSLASH_ESCAPES','STRICT_TRANS_TABLES','STRICT_ALL_TABLES','NO_ZERO_IN_DATE','NO_ZERO_DATE','INVALID_DATES','ERROR_FOR_DIVISION_BY_ZERO','TRADITIONAL','NO_AUTO_CREATE_USER','HIGH_NOT_PRECEDENCE','NO_ENGINE_SUBSTITUTION','PAD_CHAR_TO_FULL_LENGTH') NOT NULL DEFAULT '', | ||
2180 | 175 | `comment` char(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '', | ||
2181 | 176 | `character_set_client` char(32) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL, | ||
2182 | 177 | `collation_connection` char(32) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL, | ||
2183 | 178 | `db_collation` char(32) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL, | ||
2184 | 179 | `body_utf8` longblob, | ||
2185 | 180 | PRIMARY KEY (`db`,`name`,`type`) | ||
2186 | 181 | ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Stored Procedures' | ||
2187 | 182 | |||
2188 | 13 | mysql.procs_priv | 183 | mysql.procs_priv |
2189 | 184 | CREATE TABLE `procs_priv` ( | ||
2190 | 185 | `Host` char(60) COLLATE utf8_bin NOT NULL DEFAULT '', | ||
2191 | 186 | `Db` char(64) COLLATE utf8_bin NOT NULL DEFAULT '', | ||
2192 | 187 | `User` char(16) COLLATE utf8_bin NOT NULL DEFAULT '', | ||
2193 | 188 | `Routine_name` char(64) COLLATE utf8_bin NOT NULL DEFAULT '', | ||
2194 | 189 | `Routine_type` enum('FUNCTION','PROCEDURE') COLLATE utf8_bin NOT NULL, | ||
2195 | 190 | `Grantor` char(77) COLLATE utf8_bin NOT NULL DEFAULT '', | ||
2196 | 191 | `Proc_priv` set('Execute','Alter Routine','Grant') CHARACTER SET utf8 NOT NULL DEFAULT '', | ||
2197 | 192 | `Timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, | ||
2198 | 193 | PRIMARY KEY (`Host`,`Db`,`User`,`Routine_name`,`Routine_type`), | ||
2199 | 194 | KEY `Grantor` (`Grantor`) | ||
2200 | 195 | ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='Procedure privileges' | ||
2201 | 196 | |||
2202 | 14 | mysql.servers | 197 | mysql.servers |
2203 | 198 | CREATE TABLE `servers` ( | ||
2204 | 199 | `Server_name` char(64) NOT NULL DEFAULT '', | ||
2205 | 200 | `Host` char(64) NOT NULL DEFAULT '', | ||
2206 | 201 | `Db` char(64) NOT NULL DEFAULT '', | ||
2207 | 202 | `Username` char(64) NOT NULL DEFAULT '', | ||
2208 | 203 | `Password` char(64) NOT NULL DEFAULT '', | ||
2209 | 204 | `Port` int(4) NOT NULL DEFAULT '0', | ||
2210 | 205 | `Socket` char(64) NOT NULL DEFAULT '', | ||
2211 | 206 | `Wrapper` char(64) NOT NULL DEFAULT '', | ||
2212 | 207 | `Owner` char(64) NOT NULL DEFAULT '', | ||
2213 | 208 | PRIMARY KEY (`Server_name`) | ||
2214 | 209 | ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='MySQL Foreign Servers table' | ||
2215 | 210 | |||
2216 | 15 | mysql.tables_priv | 211 | mysql.tables_priv |
2217 | 212 | CREATE TABLE `tables_priv` ( | ||
2218 | 213 | `Host` char(60) COLLATE utf8_bin NOT NULL DEFAULT '', | ||
2219 | 214 | `Db` char(64) COLLATE utf8_bin NOT NULL DEFAULT '', | ||
2220 | 215 | `User` char(16) COLLATE utf8_bin NOT NULL DEFAULT '', | ||
2221 | 216 | `Table_name` char(64) COLLATE utf8_bin NOT NULL DEFAULT '', | ||
2222 | 217 | `Grantor` char(77) COLLATE utf8_bin NOT NULL DEFAULT '', | ||
2223 | 218 | `Timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, | ||
2224 | 219 | `Table_priv` set('Select','Insert','Update','Delete','Create','Drop','Grant','References','Index','Alter','Create View','Show view','Trigger') CHARACTER SET utf8 NOT NULL DEFAULT '', | ||
2225 | 220 | `Column_priv` set('Select','Insert','Update','References') CHARACTER SET utf8 NOT NULL DEFAULT '', | ||
2226 | 221 | PRIMARY KEY (`Host`,`Db`,`User`,`Table_name`), | ||
2227 | 222 | KEY `Grantor` (`Grantor`) | ||
2228 | 223 | ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='Table privileges' | ||
2229 | 224 | |||
2230 | 16 | mysql.time_zone | 225 | mysql.time_zone |
2231 | 226 | CREATE TABLE `time_zone` ( | ||
2232 | 227 | `Time_zone_id` int(10) unsigned NOT NULL AUTO_INCREMENT, | ||
2233 | 228 | `Use_leap_seconds` enum('Y','N') NOT NULL DEFAULT 'N', | ||
2234 | 229 | PRIMARY KEY (`Time_zone_id`) | ||
2235 | 230 | ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Time zones' | ||
2236 | 231 | |||
2237 | 17 | mysql.time_zone_leap_second | 232 | mysql.time_zone_leap_second |
2238 | 233 | CREATE TABLE `time_zone_leap_second` ( | ||
2239 | 234 | `Transition_time` bigint(20) NOT NULL, | ||
2240 | 235 | `Correction` int(11) NOT NULL, | ||
2241 | 236 | PRIMARY KEY (`Transition_time`) | ||
2242 | 237 | ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Leap seconds information for time zones' | ||
2243 | 238 | |||
2244 | 18 | mysql.time_zone_name | 239 | mysql.time_zone_name |
2245 | 240 | CREATE TABLE `time_zone_name` ( | ||
2246 | 241 | `Name` char(64) NOT NULL, | ||
2247 | 242 | `Time_zone_id` int(10) unsigned NOT NULL, | ||
2248 | 243 | PRIMARY KEY (`Name`) | ||
2249 | 244 | ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Time zone names' | ||
2250 | 245 | |||
2251 | 19 | mysql.time_zone_transition | 246 | mysql.time_zone_transition |
2252 | 247 | CREATE TABLE `time_zone_transition` ( | ||
2253 | 248 | `Time_zone_id` int(10) unsigned NOT NULL, | ||
2254 | 249 | `Transition_time` bigint(20) NOT NULL, | ||
2255 | 250 | `Transition_type_id` int(10) unsigned NOT NULL, | ||
2256 | 251 | PRIMARY KEY (`Time_zone_id`,`Transition_time`) | ||
2257 | 252 | ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Time zone transitions' | ||
2258 | 253 | |||
2259 | 20 | mysql.time_zone_transition_type | 254 | mysql.time_zone_transition_type |
2260 | 255 | CREATE TABLE `time_zone_transition_type` ( | ||
2261 | 256 | `Time_zone_id` int(10) unsigned NOT NULL, | ||
2262 | 257 | `Transition_type_id` int(10) unsigned NOT NULL, | ||
2263 | 258 | `Offset` int(11) NOT NULL DEFAULT '0', | ||
2264 | 259 | `Is_DST` tinyint(3) unsigned NOT NULL DEFAULT '0', | ||
2265 | 260 | `Abbreviation` char(8) NOT NULL DEFAULT '', | ||
2266 | 261 | PRIMARY KEY (`Time_zone_id`,`Transition_type_id`) | ||
2267 | 262 | ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Time zone transition types' | ||
2268 | 263 | |||
2269 | 21 | mysql.user | 264 | mysql.user |
2270 | 265 | CREATE TABLE `user` ( | ||
2271 | 266 | `Host` char(60) COLLATE utf8_bin NOT NULL DEFAULT '', | ||
2272 | 267 | `User` char(16) COLLATE utf8_bin NOT NULL DEFAULT '', | ||
2273 | 268 | `Password` char(41) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '', | ||
2274 | 269 | `Select_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', | ||
2275 | 270 | `Insert_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', | ||
2276 | 271 | `Update_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', | ||
2277 | 272 | `Delete_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', | ||
2278 | 273 | `Create_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', | ||
2279 | 274 | `Drop_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', | ||
2280 | 275 | `Reload_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', | ||
2281 | 276 | `Shutdown_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', | ||
2282 | 277 | `Process_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', | ||
2283 | 278 | `File_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', | ||
2284 | 279 | `Grant_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', | ||
2285 | 280 | `References_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', | ||
2286 | 281 | `Index_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', | ||
2287 | 282 | `Alter_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', | ||
2288 | 283 | `Show_db_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', | ||
2289 | 284 | `Super_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', | ||
2290 | 285 | `Create_tmp_table_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', | ||
2291 | 286 | `Lock_tables_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', | ||
2292 | 287 | `Execute_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', | ||
2293 | 288 | `Repl_slave_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', | ||
2294 | 289 | `Repl_client_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', | ||
2295 | 290 | `Create_view_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', | ||
2296 | 291 | `Show_view_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', | ||
2297 | 292 | `Create_routine_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', | ||
2298 | 293 | `Alter_routine_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', | ||
2299 | 294 | `Create_user_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', | ||
2300 | 295 | `Event_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', | ||
2301 | 296 | `Trigger_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', | ||
2302 | 297 | `ssl_type` enum('','ANY','X509','SPECIFIED') CHARACTER SET utf8 NOT NULL DEFAULT '', | ||
2303 | 298 | `ssl_cipher` blob NOT NULL, | ||
2304 | 299 | `x509_issuer` blob NOT NULL, | ||
2305 | 300 | `x509_subject` blob NOT NULL, | ||
2306 | 301 | `max_questions` int(11) unsigned NOT NULL DEFAULT '0', | ||
2307 | 302 | `max_updates` int(11) unsigned NOT NULL DEFAULT '0', | ||
2308 | 303 | `max_connections` int(11) unsigned NOT NULL DEFAULT '0', | ||
2309 | 304 | `max_user_connections` int(11) unsigned NOT NULL DEFAULT '0', | ||
2310 | 305 | PRIMARY KEY (`Host`,`User`) | ||
2311 | 306 | ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='Users and global privileges' | ||
2312 | 307 | |||
2313 | 22 | sakila.actor | 308 | sakila.actor |
2314 | 309 | CREATE TABLE `actor` ( | ||
2315 | 310 | `actor_id` smallint(5) unsigned NOT NULL AUTO_INCREMENT, | ||
2316 | 311 | `first_name` varchar(45) NOT NULL, | ||
2317 | 312 | `last_name` varchar(45) NOT NULL, | ||
2318 | 313 | `last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, | ||
2319 | 314 | PRIMARY KEY (`actor_id`), | ||
2320 | 315 | KEY `idx_actor_last_name` (`last_name`) | ||
2321 | 316 | ) ENGINE=InnoDB AUTO_INCREMENT=201 DEFAULT CHARSET=utf8 | ||
2322 | 317 | |||
2323 | 23 | sakila.address | 318 | sakila.address |
2324 | 319 | CREATE TABLE `address` ( | ||
2325 | 320 | `address_id` smallint(5) unsigned NOT NULL AUTO_INCREMENT, | ||
2326 | 321 | `address` varchar(50) NOT NULL, | ||
2327 | 322 | `address2` varchar(50) DEFAULT NULL, | ||
2328 | 323 | `district` varchar(20) NOT NULL, | ||
2329 | 324 | `city_id` smallint(5) unsigned NOT NULL, | ||
2330 | 325 | `postal_code` varchar(10) DEFAULT NULL, | ||
2331 | 326 | `phone` varchar(20) NOT NULL, | ||
2332 | 327 | `last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, | ||
2333 | 328 | PRIMARY KEY (`address_id`), | ||
2334 | 329 | KEY `idx_fk_city_id` (`city_id`), | ||
2335 | 330 | CONSTRAINT `fk_address_city` FOREIGN KEY (`city_id`) REFERENCES `city` (`city_id`) ON UPDATE CASCADE | ||
2336 | 331 | ) ENGINE=InnoDB AUTO_INCREMENT=606 DEFAULT CHARSET=utf8 | ||
2337 | 332 | |||
2338 | 24 | sakila.category | 333 | sakila.category |
2339 | 334 | CREATE TABLE `category` ( | ||
2340 | 335 | `category_id` tinyint(3) unsigned NOT NULL AUTO_INCREMENT, | ||
2341 | 336 | `name` varchar(25) NOT NULL, | ||
2342 | 337 | `last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, | ||
2343 | 338 | PRIMARY KEY (`category_id`) | ||
2344 | 339 | ) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8 | ||
2345 | 340 | |||
2346 | 25 | sakila.city | 341 | sakila.city |
2347 | 342 | CREATE TABLE `city` ( | ||
2348 | 343 | `city_id` smallint(5) unsigned NOT NULL AUTO_INCREMENT, | ||
2349 | 344 | `city` varchar(50) NOT NULL, | ||
2350 | 345 | `country_id` smallint(5) unsigned NOT NULL, | ||
2351 | 346 | `last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, | ||
2352 | 347 | PRIMARY KEY (`city_id`), | ||
2353 | 348 | KEY `idx_fk_country_id` (`country_id`), | ||
2354 | 349 | CONSTRAINT `fk_city_country` FOREIGN KEY (`country_id`) REFERENCES `country` (`country_id`) ON UPDATE CASCADE | ||
2355 | 350 | ) ENGINE=InnoDB AUTO_INCREMENT=601 DEFAULT CHARSET=utf8 | ||
2356 | 351 | |||
2357 | 26 | sakila.country | 352 | sakila.country |
2358 | 353 | CREATE TABLE `country` ( | ||
2359 | 354 | `country_id` smallint(5) unsigned NOT NULL AUTO_INCREMENT, | ||
2360 | 355 | `country` varchar(50) NOT NULL, | ||
2361 | 356 | `last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, | ||
2362 | 357 | PRIMARY KEY (`country_id`) | ||
2363 | 358 | ) ENGINE=InnoDB AUTO_INCREMENT=110 DEFAULT CHARSET=utf8 | ||
2364 | 359 | |||
2365 | 27 | sakila.customer | 360 | sakila.customer |
2366 | 361 | CREATE TABLE `customer` ( | ||
2367 | 362 | `customer_id` smallint(5) unsigned NOT NULL AUTO_INCREMENT, | ||
2368 | 363 | `store_id` tinyint(3) unsigned NOT NULL, | ||
2369 | 364 | `first_name` varchar(45) NOT NULL, | ||
2370 | 365 | `last_name` varchar(45) NOT NULL, | ||
2371 | 366 | `email` varchar(50) DEFAULT NULL, | ||
2372 | 367 | `address_id` smallint(5) unsigned NOT NULL, | ||
2373 | 368 | `active` tinyint(1) NOT NULL DEFAULT '1', | ||
2374 | 369 | `create_date` datetime NOT NULL, | ||
2375 | 370 | `last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, | ||
2376 | 371 | PRIMARY KEY (`customer_id`), | ||
2377 | 372 | KEY `idx_fk_store_id` (`store_id`), | ||
2378 | 373 | KEY `idx_fk_address_id` (`address_id`), | ||
2379 | 374 | KEY `idx_last_name` (`last_name`), | ||
2380 | 375 | CONSTRAINT `fk_customer_address` FOREIGN KEY (`address_id`) REFERENCES `address` (`address_id`) ON UPDATE CASCADE, | ||
2381 | 376 | CONSTRAINT `fk_customer_store` FOREIGN KEY (`store_id`) REFERENCES `store` (`store_id`) ON UPDATE CASCADE | ||
2382 | 377 | ) ENGINE=InnoDB AUTO_INCREMENT=600 DEFAULT CHARSET=utf8 | ||
2383 | 378 | |||
2384 | 28 | sakila.film | 379 | sakila.film |
2385 | 380 | CREATE TABLE `film` ( | ||
2386 | 381 | `film_id` smallint(5) unsigned NOT NULL AUTO_INCREMENT, | ||
2387 | 382 | `title` varchar(255) NOT NULL, | ||
2388 | 383 | `description` text, | ||
2389 | 384 | `release_year` year(4) DEFAULT NULL, | ||
2390 | 385 | `language_id` tinyint(3) unsigned NOT NULL, | ||
2391 | 386 | `original_language_id` tinyint(3) unsigned DEFAULT NULL, | ||
2392 | 387 | `rental_duration` tinyint(3) unsigned NOT NULL DEFAULT '3', | ||
2393 | 388 | `rental_rate` decimal(4,2) NOT NULL DEFAULT '4.99', | ||
2394 | 389 | `length` smallint(5) unsigned DEFAULT NULL, | ||
2395 | 390 | `replacement_cost` decimal(5,2) NOT NULL DEFAULT '19.99', | ||
2396 | 391 | `rating` enum('G','PG','PG-13','R','NC-17') DEFAULT 'G', | ||
2397 | 392 | `special_features` set('Trailers','Commentaries','Deleted Scenes','Behind the Scenes') DEFAULT NULL, | ||
2398 | 393 | `last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, | ||
2399 | 394 | PRIMARY KEY (`film_id`), | ||
2400 | 395 | KEY `idx_title` (`title`), | ||
2401 | 396 | KEY `idx_fk_language_id` (`language_id`), | ||
2402 | 397 | KEY `idx_fk_original_language_id` (`original_language_id`), | ||
2403 | 398 | CONSTRAINT `fk_film_language` FOREIGN KEY (`language_id`) REFERENCES `language` (`language_id`) ON UPDATE CASCADE, | ||
2404 | 399 | CONSTRAINT `fk_film_language_original` FOREIGN KEY (`original_language_id`) REFERENCES `language` (`language_id`) ON UPDATE CASCADE | ||
2405 | 400 | ) ENGINE=InnoDB AUTO_INCREMENT=1001 DEFAULT CHARSET=utf8 | ||
2406 | 401 | |||
2407 | 29 | sakila.film_actor | 402 | sakila.film_actor |
2408 | 403 | CREATE TABLE `film_actor` ( | ||
2409 | 404 | `actor_id` smallint(5) unsigned NOT NULL, | ||
2410 | 405 | `film_id` smallint(5) unsigned NOT NULL, | ||
2411 | 406 | `last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, | ||
2412 | 407 | PRIMARY KEY (`actor_id`,`film_id`), | ||
2413 | 408 | KEY `idx_fk_film_id` (`film_id`), | ||
2414 | 409 | CONSTRAINT `fk_film_actor_actor` FOREIGN KEY (`actor_id`) REFERENCES `actor` (`actor_id`) ON UPDATE CASCADE, | ||
2415 | 410 | CONSTRAINT `fk_film_actor_film` FOREIGN KEY (`film_id`) REFERENCES `film` (`film_id`) ON UPDATE CASCADE | ||
2416 | 411 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8 | ||
2417 | 412 | |||
2418 | 30 | sakila.film_category | 413 | sakila.film_category |
2419 | 414 | CREATE TABLE `film_category` ( | ||
2420 | 415 | `film_id` smallint(5) unsigned NOT NULL, | ||
2421 | 416 | `category_id` tinyint(3) unsigned NOT NULL, | ||
2422 | 417 | `last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, | ||
2423 | 418 | PRIMARY KEY (`film_id`,`category_id`), | ||
2424 | 419 | KEY `fk_film_category_category` (`category_id`), | ||
2425 | 420 | CONSTRAINT `fk_film_category_film` FOREIGN KEY (`film_id`) REFERENCES `film` (`film_id`) ON UPDATE CASCADE, | ||
2426 | 421 | CONSTRAINT `fk_film_category_category` FOREIGN KEY (`category_id`) REFERENCES `category` (`category_id`) ON UPDATE CASCADE | ||
2427 | 422 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8 | ||
2428 | 423 | |||
2429 | 31 | sakila.film_text | 424 | sakila.film_text |
2430 | 425 | CREATE TABLE `film_text` ( | ||
2431 | 426 | `film_id` smallint(6) NOT NULL, | ||
2432 | 427 | `title` varchar(255) NOT NULL, | ||
2433 | 428 | `description` text, | ||
2434 | 429 | PRIMARY KEY (`film_id`), | ||
2435 | 430 | FULLTEXT KEY `idx_title_description` (`title`,`description`) | ||
2436 | 431 | ) ENGINE=MyISAM DEFAULT CHARSET=utf8 | ||
2437 | 432 | |||
2438 | 32 | sakila.inventory | 433 | sakila.inventory |
2439 | 434 | CREATE TABLE `inventory` ( | ||
2440 | 435 | `inventory_id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, | ||
2441 | 436 | `film_id` smallint(5) unsigned NOT NULL, | ||
2442 | 437 | `store_id` tinyint(3) unsigned NOT NULL, | ||
2443 | 438 | `last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, | ||
2444 | 439 | PRIMARY KEY (`inventory_id`), | ||
2445 | 440 | KEY `idx_fk_film_id` (`film_id`), | ||
2446 | 441 | KEY `idx_store_id_film_id` (`store_id`,`film_id`), | ||
2447 | 442 | CONSTRAINT `fk_inventory_store` FOREIGN KEY (`store_id`) REFERENCES `store` (`store_id`) ON UPDATE CASCADE, | ||
2448 | 443 | CONSTRAINT `fk_inventory_film` FOREIGN KEY (`film_id`) REFERENCES `film` (`film_id`) ON UPDATE CASCADE | ||
2449 | 444 | ) ENGINE=InnoDB AUTO_INCREMENT=4582 DEFAULT CHARSET=utf8 | ||
2450 | 445 | |||
2451 | 33 | sakila.language | 446 | sakila.language |
2452 | 447 | CREATE TABLE `language` ( | ||
2453 | 448 | `language_id` tinyint(3) unsigned NOT NULL AUTO_INCREMENT, | ||
2454 | 449 | `name` char(20) NOT NULL, | ||
2455 | 450 | `last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, | ||
2456 | 451 | PRIMARY KEY (`language_id`) | ||
2457 | 452 | ) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8 | ||
2458 | 453 | |||
2459 | 34 | sakila.payment | 454 | sakila.payment |
2460 | 455 | CREATE TABLE `payment` ( | ||
2461 | 456 | `payment_id` smallint(5) unsigned NOT NULL AUTO_INCREMENT, | ||
2462 | 457 | `customer_id` smallint(5) unsigned NOT NULL, | ||
2463 | 458 | `staff_id` tinyint(3) unsigned NOT NULL, | ||
2464 | 459 | `rental_id` int(11) DEFAULT NULL, | ||
2465 | 460 | `amount` decimal(5,2) NOT NULL, | ||
2466 | 461 | `payment_date` datetime NOT NULL, | ||
2467 | 462 | `last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, | ||
2468 | 463 | PRIMARY KEY (`payment_id`), | ||
2469 | 464 | KEY `idx_fk_staff_id` (`staff_id`), | ||
2470 | 465 | KEY `idx_fk_customer_id` (`customer_id`), | ||
2471 | 466 | KEY `fk_payment_rental` (`rental_id`), | ||
2472 | 467 | CONSTRAINT `fk_payment_rental` FOREIGN KEY (`rental_id`) REFERENCES `rental` (`rental_id`) ON DELETE SET NULL ON UPDATE CASCADE, | ||
2473 | 468 | CONSTRAINT `fk_payment_customer` FOREIGN KEY (`customer_id`) REFERENCES `customer` (`customer_id`) ON UPDATE CASCADE, | ||
2474 | 469 | CONSTRAINT `fk_payment_staff` FOREIGN KEY (`staff_id`) REFERENCES `staff` (`staff_id`) ON UPDATE CASCADE | ||
2475 | 470 | ) ENGINE=InnoDB AUTO_INCREMENT=16050 DEFAULT CHARSET=utf8 | ||
2476 | 471 | |||
2477 | 35 | sakila.rental | 472 | sakila.rental |
2478 | 473 | CREATE TABLE `rental` ( | ||
2479 | 474 | `rental_id` int(11) NOT NULL AUTO_INCREMENT, | ||
2480 | 475 | `rental_date` datetime NOT NULL, | ||
2481 | 476 | `inventory_id` mediumint(8) unsigned NOT NULL, | ||
2482 | 477 | `customer_id` smallint(5) unsigned NOT NULL, | ||
2483 | 478 | `return_date` datetime DEFAULT NULL, | ||
2484 | 479 | `staff_id` tinyint(3) unsigned NOT NULL, | ||
2485 | 480 | `last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, | ||
2486 | 481 | PRIMARY KEY (`rental_id`), | ||
2487 | 482 | UNIQUE KEY `rental_date` (`rental_date`,`inventory_id`,`customer_id`), | ||
2488 | 483 | KEY `idx_fk_inventory_id` (`inventory_id`), | ||
2489 | 484 | KEY `idx_fk_customer_id` (`customer_id`), | ||
2490 | 485 | KEY `idx_fk_staff_id` (`staff_id`), | ||
2491 | 486 | CONSTRAINT `fk_rental_staff` FOREIGN KEY (`staff_id`) REFERENCES `staff` (`staff_id`) ON UPDATE CASCADE, | ||
2492 | 487 | CONSTRAINT `fk_rental_inventory` FOREIGN KEY (`inventory_id`) REFERENCES `inventory` (`inventory_id`) ON UPDATE CASCADE, | ||
2493 | 488 | CONSTRAINT `fk_rental_customer` FOREIGN KEY (`customer_id`) REFERENCES `customer` (`customer_id`) ON UPDATE CASCADE | ||
2494 | 489 | ) ENGINE=InnoDB AUTO_INCREMENT=16050 DEFAULT CHARSET=utf8 | ||
2495 | 490 | |||
2496 | 36 | sakila.staff | 491 | sakila.staff |
2497 | 492 | CREATE TABLE `staff` ( | ||
2498 | 493 | `staff_id` tinyint(3) unsigned NOT NULL AUTO_INCREMENT, | ||
2499 | 494 | `first_name` varchar(45) NOT NULL, | ||
2500 | 495 | `last_name` varchar(45) NOT NULL, | ||
2501 | 496 | `address_id` smallint(5) unsigned NOT NULL, | ||
2502 | 497 | `picture` blob, | ||
2503 | 498 | `email` varchar(50) DEFAULT NULL, | ||
2504 | 499 | `store_id` tinyint(3) unsigned NOT NULL, | ||
2505 | 500 | `active` tinyint(1) NOT NULL DEFAULT '1', | ||
2506 | 501 | `username` varchar(16) NOT NULL, | ||
2507 | 502 | `password` varchar(40) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL, | ||
2508 | 503 | `last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, | ||
2509 | 504 | PRIMARY KEY (`staff_id`), | ||
2510 | 505 | KEY `idx_fk_store_id` (`store_id`), | ||
2511 | 506 | KEY `idx_fk_address_id` (`address_id`), | ||
2512 | 507 | CONSTRAINT `fk_staff_store` FOREIGN KEY (`store_id`) REFERENCES `store` (`store_id`) ON UPDATE CASCADE, | ||
2513 | 508 | CONSTRAINT `fk_staff_address` FOREIGN KEY (`address_id`) REFERENCES `address` (`address_id`) ON UPDATE CASCADE | ||
2514 | 509 | ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 | ||
2515 | 510 | |||
2516 | 37 | sakila.store | 511 | sakila.store |
2517 | 512 | CREATE TABLE `store` ( | ||
2518 | 513 | `store_id` tinyint(3) unsigned NOT NULL AUTO_INCREMENT, | ||
2519 | 514 | `manager_staff_id` tinyint(3) unsigned NOT NULL, | ||
2520 | 515 | `address_id` smallint(5) unsigned NOT NULL, | ||
2521 | 516 | `last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, | ||
2522 | 517 | PRIMARY KEY (`store_id`), | ||
2523 | 518 | UNIQUE KEY `idx_unique_manager` (`manager_staff_id`), | ||
2524 | 519 | KEY `idx_fk_address_id` (`address_id`), | ||
2525 | 520 | CONSTRAINT `fk_store_staff` FOREIGN KEY (`manager_staff_id`) REFERENCES `staff` (`staff_id`) ON UPDATE CASCADE, | ||
2526 | 521 | CONSTRAINT `fk_store_address` FOREIGN KEY (`address_id`) REFERENCES `address` (`address_id`) ON UPDATE CASCADE | ||
2527 | 522 | ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 | ||
2528 | 523 | |||
2529 | 38 | 524 | ||
2530 | === added file 't/lib/samples/SchemaIterator/resume-from-ignored-sakila-payment-5.0.txt' | |||
2531 | --- t/lib/samples/SchemaIterator/resume-from-ignored-sakila-payment-5.0.txt 1970-01-01 00:00:00 +0000 | |||
2532 | +++ t/lib/samples/SchemaIterator/resume-from-ignored-sakila-payment-5.0.txt 2012-05-30 22:08:19 +0000 | |||
2533 | @@ -0,0 +1,52 @@ | |||
2534 | 1 | sakila.rental | ||
2535 | 2 | CREATE TABLE `rental` ( | ||
2536 | 3 | `rental_id` int(11) NOT NULL auto_increment, | ||
2537 | 4 | `rental_date` datetime NOT NULL, | ||
2538 | 5 | `inventory_id` mediumint(8) unsigned NOT NULL, | ||
2539 | 6 | `customer_id` smallint(5) unsigned NOT NULL, | ||
2540 | 7 | `return_date` datetime default NULL, | ||
2541 | 8 | `staff_id` tinyint(3) unsigned NOT NULL, | ||
2542 | 9 | `last_update` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP, | ||
2543 | 10 | PRIMARY KEY (`rental_id`), | ||
2544 | 11 | UNIQUE KEY `rental_date` (`rental_date`,`inventory_id`,`customer_id`), | ||
2545 | 12 | KEY `idx_fk_inventory_id` (`inventory_id`), | ||
2546 | 13 | KEY `idx_fk_customer_id` (`customer_id`), | ||
2547 | 14 | KEY `idx_fk_staff_id` (`staff_id`), | ||
2548 | 15 | CONSTRAINT `fk_rental_staff` FOREIGN KEY (`staff_id`) REFERENCES `staff` (`staff_id`) ON UPDATE CASCADE, | ||
2549 | 16 | CONSTRAINT `fk_rental_inventory` FOREIGN KEY (`inventory_id`) REFERENCES `inventory` (`inventory_id`) ON UPDATE CASCADE, | ||
2550 | 17 | CONSTRAINT `fk_rental_customer` FOREIGN KEY (`customer_id`) REFERENCES `customer` (`customer_id`) ON UPDATE CASCADE | ||
2551 | 18 | ) ENGINE=InnoDB AUTO_INCREMENT=16050 DEFAULT CHARSET=utf8 | ||
2552 | 19 | |||
2553 | 20 | sakila.staff | ||
2554 | 21 | CREATE TABLE `staff` ( | ||
2555 | 22 | `staff_id` tinyint(3) unsigned NOT NULL auto_increment, | ||
2556 | 23 | `first_name` varchar(45) NOT NULL, | ||
2557 | 24 | `last_name` varchar(45) NOT NULL, | ||
2558 | 25 | `address_id` smallint(5) unsigned NOT NULL, | ||
2559 | 26 | `picture` blob, | ||
2560 | 27 | `email` varchar(50) default NULL, | ||
2561 | 28 | `store_id` tinyint(3) unsigned NOT NULL, | ||
2562 | 29 | `active` tinyint(1) NOT NULL default '1', | ||
2563 | 30 | `username` varchar(16) NOT NULL, | ||
2564 | 31 | `password` varchar(40) character set utf8 collate utf8_bin default NULL, | ||
2565 | 32 | `last_update` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP, | ||
2566 | 33 | PRIMARY KEY (`staff_id`), | ||
2567 | 34 | KEY `idx_fk_store_id` (`store_id`), | ||
2568 | 35 | KEY `idx_fk_address_id` (`address_id`), | ||
2569 | 36 | CONSTRAINT `fk_staff_store` FOREIGN KEY (`store_id`) REFERENCES `store` (`store_id`) ON UPDATE CASCADE, | ||
2570 | 37 | CONSTRAINT `fk_staff_address` FOREIGN KEY (`address_id`) REFERENCES `address` (`address_id`) ON UPDATE CASCADE | ||
2571 | 38 | ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 | ||
2572 | 39 | |||
2573 | 40 | sakila.store | ||
2574 | 41 | CREATE TABLE `store` ( | ||
2575 | 42 | `store_id` tinyint(3) unsigned NOT NULL auto_increment, | ||
2576 | 43 | `manager_staff_id` tinyint(3) unsigned NOT NULL, | ||
2577 | 44 | `address_id` smallint(5) unsigned NOT NULL, | ||
2578 | 45 | `last_update` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP, | ||
2579 | 46 | PRIMARY KEY (`store_id`), | ||
2580 | 47 | UNIQUE KEY `idx_unique_manager` (`manager_staff_id`), | ||
2581 | 48 | KEY `idx_fk_address_id` (`address_id`), | ||
2582 | 49 | CONSTRAINT `fk_store_staff` FOREIGN KEY (`manager_staff_id`) REFERENCES `staff` (`staff_id`) ON UPDATE CASCADE, | ||
2583 | 50 | CONSTRAINT `fk_store_address` FOREIGN KEY (`address_id`) REFERENCES `address` (`address_id`) ON UPDATE CASCADE | ||
2584 | 51 | ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 | ||
2585 | 52 | |||
2586 | 0 | 53 | ||
2587 | === modified file 't/lib/samples/SchemaIterator/resume-from-ignored-sakila-payment.txt' | |||
2588 | --- t/lib/samples/SchemaIterator/resume-from-ignored-sakila-payment.txt 2011-11-08 17:20:59 +0000 | |||
2589 | +++ t/lib/samples/SchemaIterator/resume-from-ignored-sakila-payment.txt 2012-05-30 22:08:19 +0000 | |||
2590 | @@ -1,3 +1,52 @@ | |||
2591 | 1 | sakila.rental | 1 | sakila.rental |
2592 | 2 | CREATE TABLE `rental` ( | ||
2593 | 3 | `rental_id` int(11) NOT NULL AUTO_INCREMENT, | ||
2594 | 4 | `rental_date` datetime NOT NULL, | ||
2595 | 5 | `inventory_id` mediumint(8) unsigned NOT NULL, | ||
2596 | 6 | `customer_id` smallint(5) unsigned NOT NULL, | ||
2597 | 7 | `return_date` datetime DEFAULT NULL, | ||
2598 | 8 | `staff_id` tinyint(3) unsigned NOT NULL, | ||
2599 | 9 | `last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, | ||
2600 | 10 | PRIMARY KEY (`rental_id`), | ||
2601 | 11 | UNIQUE KEY `rental_date` (`rental_date`,`inventory_id`,`customer_id`), | ||
2602 | 12 | KEY `idx_fk_inventory_id` (`inventory_id`), | ||
2603 | 13 | KEY `idx_fk_customer_id` (`customer_id`), | ||
2604 | 14 | KEY `idx_fk_staff_id` (`staff_id`), | ||
2605 | 15 | CONSTRAINT `fk_rental_staff` FOREIGN KEY (`staff_id`) REFERENCES `staff` (`staff_id`) ON UPDATE CASCADE, | ||
2606 | 16 | CONSTRAINT `fk_rental_inventory` FOREIGN KEY (`inventory_id`) REFERENCES `inventory` (`inventory_id`) ON UPDATE CASCADE, | ||
2607 | 17 | CONSTRAINT `fk_rental_customer` FOREIGN KEY (`customer_id`) REFERENCES `customer` (`customer_id`) ON UPDATE CASCADE | ||
2608 | 18 | ) ENGINE=InnoDB AUTO_INCREMENT=16050 DEFAULT CHARSET=utf8 | ||
2609 | 19 | |||
2610 | 2 | sakila.staff | 20 | sakila.staff |
2611 | 21 | CREATE TABLE `staff` ( | ||
2612 | 22 | `staff_id` tinyint(3) unsigned NOT NULL AUTO_INCREMENT, | ||
2613 | 23 | `first_name` varchar(45) NOT NULL, | ||
2614 | 24 | `last_name` varchar(45) NOT NULL, | ||
2615 | 25 | `address_id` smallint(5) unsigned NOT NULL, | ||
2616 | 26 | `picture` blob, | ||
2617 | 27 | `email` varchar(50) DEFAULT NULL, | ||
2618 | 28 | `store_id` tinyint(3) unsigned NOT NULL, | ||
2619 | 29 | `active` tinyint(1) NOT NULL DEFAULT '1', | ||
2620 | 30 | `username` varchar(16) NOT NULL, | ||
2621 | 31 | `password` varchar(40) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL, | ||
2622 | 32 | `last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, | ||
2623 | 33 | PRIMARY KEY (`staff_id`), | ||
2624 | 34 | KEY `idx_fk_store_id` (`store_id`), | ||
2625 | 35 | KEY `idx_fk_address_id` (`address_id`), | ||
2626 | 36 | CONSTRAINT `fk_staff_store` FOREIGN KEY (`store_id`) REFERENCES `store` (`store_id`) ON UPDATE CASCADE, | ||
2627 | 37 | CONSTRAINT `fk_staff_address` FOREIGN KEY (`address_id`) REFERENCES `address` (`address_id`) ON UPDATE CASCADE | ||
2628 | 38 | ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 | ||
2629 | 39 | |||
2630 | 3 | sakila.store | 40 | sakila.store |
2631 | 41 | CREATE TABLE `store` ( | ||
2632 | 42 | `store_id` tinyint(3) unsigned NOT NULL AUTO_INCREMENT, | ||
2633 | 43 | `manager_staff_id` tinyint(3) unsigned NOT NULL, | ||
2634 | 44 | `address_id` smallint(5) unsigned NOT NULL, | ||
2635 | 45 | `last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, | ||
2636 | 46 | PRIMARY KEY (`store_id`), | ||
2637 | 47 | UNIQUE KEY `idx_unique_manager` (`manager_staff_id`), | ||
2638 | 48 | KEY `idx_fk_address_id` (`address_id`), | ||
2639 | 49 | CONSTRAINT `fk_store_staff` FOREIGN KEY (`manager_staff_id`) REFERENCES `staff` (`staff_id`) ON UPDATE CASCADE, | ||
2640 | 50 | CONSTRAINT `fk_store_address` FOREIGN KEY (`address_id`) REFERENCES `address` (`address_id`) ON UPDATE CASCADE | ||
2641 | 51 | ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 | ||
2642 | 52 | |||
2643 | 4 | 53 | ||
2644 | === added file 't/lib/samples/SchemaIterator/resume-from-sakila-payment-5.0.txt' | |||
2645 | --- t/lib/samples/SchemaIterator/resume-from-sakila-payment-5.0.txt 1970-01-01 00:00:00 +0000 | |||
2646 | +++ t/lib/samples/SchemaIterator/resume-from-sakila-payment-5.0.txt 2012-05-30 22:08:19 +0000 | |||
2647 | @@ -0,0 +1,70 @@ | |||
2648 | 1 | sakila.payment | ||
2649 | 2 | CREATE TABLE `payment` ( | ||
2650 | 3 | `payment_id` smallint(5) unsigned NOT NULL auto_increment, | ||
2651 | 4 | `customer_id` smallint(5) unsigned NOT NULL, | ||
2652 | 5 | `staff_id` tinyint(3) unsigned NOT NULL, | ||
2653 | 6 | `rental_id` int(11) default NULL, | ||
2654 | 7 | `amount` decimal(5,2) NOT NULL, | ||
2655 | 8 | `payment_date` datetime NOT NULL, | ||
2656 | 9 | `last_update` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP, | ||
2657 | 10 | PRIMARY KEY (`payment_id`), | ||
2658 | 11 | KEY `idx_fk_staff_id` (`staff_id`), | ||
2659 | 12 | KEY `idx_fk_customer_id` (`customer_id`), | ||
2660 | 13 | KEY `fk_payment_rental` (`rental_id`), | ||
2661 | 14 | CONSTRAINT `fk_payment_rental` FOREIGN KEY (`rental_id`) REFERENCES `rental` (`rental_id`) ON DELETE SET NULL ON UPDATE CASCADE, | ||
2662 | 15 | CONSTRAINT `fk_payment_customer` FOREIGN KEY (`customer_id`) REFERENCES `customer` (`customer_id`) ON UPDATE CASCADE, | ||
2663 | 16 | CONSTRAINT `fk_payment_staff` FOREIGN KEY (`staff_id`) REFERENCES `staff` (`staff_id`) ON UPDATE CASCADE | ||
2664 | 17 | ) ENGINE=InnoDB AUTO_INCREMENT=16050 DEFAULT CHARSET=utf8 | ||
2665 | 18 | |||
2666 | 19 | sakila.rental | ||
2667 | 20 | CREATE TABLE `rental` ( | ||
2668 | 21 | `rental_id` int(11) NOT NULL auto_increment, | ||
2669 | 22 | `rental_date` datetime NOT NULL, | ||
2670 | 23 | `inventory_id` mediumint(8) unsigned NOT NULL, | ||
2671 | 24 | `customer_id` smallint(5) unsigned NOT NULL, | ||
2672 | 25 | `return_date` datetime default NULL, | ||
2673 | 26 | `staff_id` tinyint(3) unsigned NOT NULL, | ||
2674 | 27 | `last_update` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP, | ||
2675 | 28 | PRIMARY KEY (`rental_id`), | ||
2676 | 29 | UNIQUE KEY `rental_date` (`rental_date`,`inventory_id`,`customer_id`), | ||
2677 | 30 | KEY `idx_fk_inventory_id` (`inventory_id`), | ||
2678 | 31 | KEY `idx_fk_customer_id` (`customer_id`), | ||
2679 | 32 | KEY `idx_fk_staff_id` (`staff_id`), | ||
2680 | 33 | CONSTRAINT `fk_rental_staff` FOREIGN KEY (`staff_id`) REFERENCES `staff` (`staff_id`) ON UPDATE CASCADE, | ||
2681 | 34 | CONSTRAINT `fk_rental_inventory` FOREIGN KEY (`inventory_id`) REFERENCES `inventory` (`inventory_id`) ON UPDATE CASCADE, | ||
2682 | 35 | CONSTRAINT `fk_rental_customer` FOREIGN KEY (`customer_id`) REFERENCES `customer` (`customer_id`) ON UPDATE CASCADE | ||
2683 | 36 | ) ENGINE=InnoDB AUTO_INCREMENT=16050 DEFAULT CHARSET=utf8 | ||
2684 | 37 | |||
2685 | 38 | sakila.staff | ||
2686 | 39 | CREATE TABLE `staff` ( | ||
2687 | 40 | `staff_id` tinyint(3) unsigned NOT NULL auto_increment, | ||
2688 | 41 | `first_name` varchar(45) NOT NULL, | ||
2689 | 42 | `last_name` varchar(45) NOT NULL, | ||
2690 | 43 | `address_id` smallint(5) unsigned NOT NULL, | ||
2691 | 44 | `picture` blob, | ||
2692 | 45 | `email` varchar(50) default NULL, | ||
2693 | 46 | `store_id` tinyint(3) unsigned NOT NULL, | ||
2694 | 47 | `active` tinyint(1) NOT NULL default '1', | ||
2695 | 48 | `username` varchar(16) NOT NULL, | ||
2696 | 49 | `password` varchar(40) character set utf8 collate utf8_bin default NULL, | ||
2697 | 50 | `last_update` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP, | ||
2698 | 51 | PRIMARY KEY (`staff_id`), | ||
2699 | 52 | KEY `idx_fk_store_id` (`store_id`), | ||
2700 | 53 | KEY `idx_fk_address_id` (`address_id`), | ||
2701 | 54 | CONSTRAINT `fk_staff_store` FOREIGN KEY (`store_id`) REFERENCES `store` (`store_id`) ON UPDATE CASCADE, | ||
2702 | 55 | CONSTRAINT `fk_staff_address` FOREIGN KEY (`address_id`) REFERENCES `address` (`address_id`) ON UPDATE CASCADE | ||
2703 | 56 | ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 | ||
2704 | 57 | |||
2705 | 58 | sakila.store | ||
2706 | 59 | CREATE TABLE `store` ( | ||
2707 | 60 | `store_id` tinyint(3) unsigned NOT NULL auto_increment, | ||
2708 | 61 | `manager_staff_id` tinyint(3) unsigned NOT NULL, | ||
2709 | 62 | `address_id` smallint(5) unsigned NOT NULL, | ||
2710 | 63 | `last_update` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP, | ||
2711 | 64 | PRIMARY KEY (`store_id`), | ||
2712 | 65 | UNIQUE KEY `idx_unique_manager` (`manager_staff_id`), | ||
2713 | 66 | KEY `idx_fk_address_id` (`address_id`), | ||
2714 | 67 | CONSTRAINT `fk_store_staff` FOREIGN KEY (`manager_staff_id`) REFERENCES `staff` (`staff_id`) ON UPDATE CASCADE, | ||
2715 | 68 | CONSTRAINT `fk_store_address` FOREIGN KEY (`address_id`) REFERENCES `address` (`address_id`) ON UPDATE CASCADE | ||
2716 | 69 | ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 | ||
2717 | 70 | |||
2718 | 0 | 71 | ||
2719 | === modified file 't/lib/samples/SchemaIterator/resume-from-sakila-payment.txt' | |||
2720 | --- t/lib/samples/SchemaIterator/resume-from-sakila-payment.txt 2011-09-27 19:06:24 +0000 | |||
2721 | +++ t/lib/samples/SchemaIterator/resume-from-sakila-payment.txt 2012-05-30 22:08:19 +0000 | |||
2722 | @@ -1,4 +1,70 @@ | |||
2723 | 1 | sakila.payment | 1 | sakila.payment |
2724 | 2 | CREATE TABLE `payment` ( | ||
2725 | 3 | `payment_id` smallint(5) unsigned NOT NULL AUTO_INCREMENT, | ||
2726 | 4 | `customer_id` smallint(5) unsigned NOT NULL, | ||
2727 | 5 | `staff_id` tinyint(3) unsigned NOT NULL, | ||
2728 | 6 | `rental_id` int(11) DEFAULT NULL, | ||
2729 | 7 | `amount` decimal(5,2) NOT NULL, | ||
2730 | 8 | `payment_date` datetime NOT NULL, | ||
2731 | 9 | `last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, | ||
2732 | 10 | PRIMARY KEY (`payment_id`), | ||
2733 | 11 | KEY `idx_fk_staff_id` (`staff_id`), | ||
2734 | 12 | KEY `idx_fk_customer_id` (`customer_id`), | ||
2735 | 13 | KEY `fk_payment_rental` (`rental_id`), | ||
2736 | 14 | CONSTRAINT `fk_payment_rental` FOREIGN KEY (`rental_id`) REFERENCES `rental` (`rental_id`) ON DELETE SET NULL ON UPDATE CASCADE, | ||
2737 | 15 | CONSTRAINT `fk_payment_customer` FOREIGN KEY (`customer_id`) REFERENCES `customer` (`customer_id`) ON UPDATE CASCADE, | ||
2738 | 16 | CONSTRAINT `fk_payment_staff` FOREIGN KEY (`staff_id`) REFERENCES `staff` (`staff_id`) ON UPDATE CASCADE | ||
2739 | 17 | ) ENGINE=InnoDB AUTO_INCREMENT=16050 DEFAULT CHARSET=utf8 | ||
2740 | 18 | |||
2741 | 2 | sakila.rental | 19 | sakila.rental |
2742 | 20 | CREATE TABLE `rental` ( | ||
2743 | 21 | `rental_id` int(11) NOT NULL AUTO_INCREMENT, | ||
2744 | 22 | `rental_date` datetime NOT NULL, | ||
2745 | 23 | `inventory_id` mediumint(8) unsigned NOT NULL, | ||
2746 | 24 | `customer_id` smallint(5) unsigned NOT NULL, | ||
2747 | 25 | `return_date` datetime DEFAULT NULL, | ||
2748 | 26 | `staff_id` tinyint(3) unsigned NOT NULL, | ||
2749 | 27 | `last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, | ||
2750 | 28 | PRIMARY KEY (`rental_id`), | ||
2751 | 29 | UNIQUE KEY `rental_date` (`rental_date`,`inventory_id`,`customer_id`), | ||
2752 | 30 | KEY `idx_fk_inventory_id` (`inventory_id`), | ||
2753 | 31 | KEY `idx_fk_customer_id` (`customer_id`), | ||
2754 | 32 | KEY `idx_fk_staff_id` (`staff_id`), | ||
2755 | 33 | CONSTRAINT `fk_rental_staff` FOREIGN KEY (`staff_id`) REFERENCES `staff` (`staff_id`) ON UPDATE CASCADE, | ||
2756 | 34 | CONSTRAINT `fk_rental_inventory` FOREIGN KEY (`inventory_id`) REFERENCES `inventory` (`inventory_id`) ON UPDATE CASCADE, | ||
2757 | 35 | CONSTRAINT `fk_rental_customer` FOREIGN KEY (`customer_id`) REFERENCES `customer` (`customer_id`) ON UPDATE CASCADE | ||
2758 | 36 | ) ENGINE=InnoDB AUTO_INCREMENT=16050 DEFAULT CHARSET=utf8 | ||
2759 | 37 | |||
2760 | 3 | sakila.staff | 38 | sakila.staff |
2761 | 39 | CREATE TABLE `staff` ( | ||
2762 | 40 | `staff_id` tinyint(3) unsigned NOT NULL AUTO_INCREMENT, | ||
2763 | 41 | `first_name` varchar(45) NOT NULL, | ||
2764 | 42 | `last_name` varchar(45) NOT NULL, | ||
2765 | 43 | `address_id` smallint(5) unsigned NOT NULL, | ||
2766 | 44 | `picture` blob, | ||
2767 | 45 | `email` varchar(50) DEFAULT NULL, | ||
2768 | 46 | `store_id` tinyint(3) unsigned NOT NULL, | ||
2769 | 47 | `active` tinyint(1) NOT NULL DEFAULT '1', | ||
2770 | 48 | `username` varchar(16) NOT NULL, | ||
2771 | 49 | `password` varchar(40) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL, | ||
2772 | 50 | `last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, | ||
2773 | 51 | PRIMARY KEY (`staff_id`), | ||
2774 | 52 | KEY `idx_fk_store_id` (`store_id`), | ||
2775 | 53 | KEY `idx_fk_address_id` (`address_id`), | ||
2776 | 54 | CONSTRAINT `fk_staff_store` FOREIGN KEY (`store_id`) REFERENCES `store` (`store_id`) ON UPDATE CASCADE, | ||
2777 | 55 | CONSTRAINT `fk_staff_address` FOREIGN KEY (`address_id`) REFERENCES `address` (`address_id`) ON UPDATE CASCADE | ||
2778 | 56 | ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 | ||
2779 | 57 | |||
2780 | 4 | sakila.store | 58 | sakila.store |
2781 | 59 | CREATE TABLE `store` ( | ||
2782 | 60 | `store_id` tinyint(3) unsigned NOT NULL AUTO_INCREMENT, | ||
2783 | 61 | `manager_staff_id` tinyint(3) unsigned NOT NULL, | ||
2784 | 62 | `address_id` smallint(5) unsigned NOT NULL, | ||
2785 | 63 | `last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, | ||
2786 | 64 | PRIMARY KEY (`store_id`), | ||
2787 | 65 | UNIQUE KEY `idx_unique_manager` (`manager_staff_id`), | ||
2788 | 66 | KEY `idx_fk_address_id` (`address_id`), | ||
2789 | 67 | CONSTRAINT `fk_store_staff` FOREIGN KEY (`manager_staff_id`) REFERENCES `staff` (`staff_id`) ON UPDATE CASCADE, | ||
2790 | 68 | CONSTRAINT `fk_store_address` FOREIGN KEY (`address_id`) REFERENCES `address` (`address_id`) ON UPDATE CASCADE | ||
2791 | 69 | ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 | ||
2792 | 70 | |||
2793 | 5 | 71 | ||
2794 | === modified file 't/pt-table-sync/filters.t' | |||
2795 | --- t/pt-table-sync/filters.t 2011-12-22 22:43:15 +0000 | |||
2796 | +++ t/pt-table-sync/filters.t 2012-05-30 22:08:19 +0000 | |||
2797 | @@ -29,7 +29,7 @@ | |||
2798 | 29 | plan skip_all => 'Cannot connect to sandbox slave'; | 29 | plan skip_all => 'Cannot connect to sandbox slave'; |
2799 | 30 | } | 30 | } |
2800 | 31 | else { | 31 | else { |
2802 | 32 | plan tests => 4; | 32 | plan tests => 8; |
2803 | 33 | } | 33 | } |
2804 | 34 | 34 | ||
2805 | 35 | # Previous tests slave 12347 to 12346 which makes pt-table-checksum | 35 | # Previous tests slave 12347 to 12346 which makes pt-table-checksum |
2806 | @@ -106,6 +106,79 @@ | |||
2807 | 106 | ); | 106 | ); |
2808 | 107 | 107 | ||
2809 | 108 | # ############################################################################# | 108 | # ############################################################################# |
2810 | 109 | # pt-table-sync --ignore-* options don't work with --replicate | ||
2811 | 110 | # https://bugs.launchpad.net/percona-toolkit/+bug/1002365 | ||
2812 | 111 | # ############################################################################# | ||
2813 | 112 | $sb->wipe_clean($master_dbh); | ||
2814 | 113 | |||
2815 | 114 | $sb->load_file("master", "t/pt-table-sync/samples/simple-tbls.sql"); | ||
2816 | 115 | PerconaTest::wait_for_table($slave_dbh, "test.mt1", "id=10"); | ||
2817 | 116 | |||
2818 | 117 | # Create a checksum diff in a table that we're going to ignore | ||
2819 | 118 | # when we sync. | ||
2820 | 119 | $slave_dbh->do("INSERT INTO test.empty_it VALUES (null,11,11,'eleven')"); | ||
2821 | 120 | |||
2822 | 121 | # Create the checksums. | ||
2823 | 122 | diag(`$trunk/bin/pt-table-checksum h=127.1,P=12345,u=msandbox,p=msandbox -d test --quiet --quiet --lock-wait-timeout 3 --max-load ''`); | ||
2824 | 123 | |||
2825 | 124 | # Make sure all the tables were checksummed. | ||
2826 | 125 | my $rows = $master_dbh->selectall_arrayref("SELECT DISTINCT db, tbl FROM percona.checksums ORDER BY db, tbl"); | ||
2827 | 126 | is_deeply( | ||
2828 | 127 | $rows, | ||
2829 | 128 | [ [qw(test empty_it) ], | ||
2830 | 129 | [qw(test empty_mt) ], | ||
2831 | 130 | [qw(test it1) ], | ||
2832 | 131 | [qw(test it2) ], | ||
2833 | 132 | [qw(test mt1) ], | ||
2834 | 133 | [qw(test mt2) ], | ||
2835 | 134 | ], | ||
2836 | 135 | "Six checksum tables (bug 1002365)" | ||
2837 | 136 | ); | ||
2838 | 137 | |||
2839 | 138 | # Sync the checksummed tables, but ignore the table with the diff we created. | ||
2840 | 139 | $output = output( | ||
2841 | 140 | sub { pt_table_sync::main("h=127.1,P=12346,u=msandbox,p=msandbox", | ||
2842 | 141 | qw(--print --sync-to-master --replicate percona.checksums), | ||
2843 | 142 | "--ignore-tables", "test.empty_it") }, | ||
2844 | 143 | stderr => 1, | ||
2845 | 144 | ); | ||
2846 | 145 | |||
2847 | 146 | is( | ||
2848 | 147 | $output, | ||
2849 | 148 | "", | ||
2850 | 149 | "Table ignored, nothing to sync (bug 1002365)" | ||
2851 | 150 | ); | ||
2852 | 151 | |||
2853 | 152 | # Sync the checksummed tables, but ignore the database. | ||
2854 | 153 | $output = output( | ||
2855 | 154 | sub { pt_table_sync::main("h=127.1,P=12346,u=msandbox,p=msandbox", | ||
2856 | 155 | qw(--print --sync-to-master --replicate percona.checksums), | ||
2857 | 156 | "--ignore-databases", "test") }, | ||
2858 | 157 | stderr => 1, | ||
2859 | 158 | ); | ||
2860 | 159 | |||
2861 | 160 | is( | ||
2862 | 161 | $output, | ||
2863 | 162 | "", | ||
2864 | 163 | "Database ignored, nothing to sync (bug 1002365)" | ||
2865 | 164 | ); | ||
2866 | 165 | |||
2867 | 166 | # The same should work for just --sync-to-master. | ||
2868 | 167 | $output = output( | ||
2869 | 168 | sub { pt_table_sync::main("h=127.1,P=12346,u=msandbox,p=msandbox", | ||
2870 | 169 | qw(--print --sync-to-master), | ||
2871 | 170 | "--ignore-tables", "test.empty_it", | ||
2872 | 171 | "--ignore-databases", "percona") }, | ||
2873 | 172 | stderr => 1, | ||
2874 | 173 | ); | ||
2875 | 174 | |||
2876 | 175 | unlike( | ||
2877 | 176 | $output, | ||
2878 | 177 | qr/empty_it/, | ||
2879 | 178 | "Table ignored, nothing to sync-to-master (bug 1002365)" | ||
2880 | 179 | ); | ||
2881 | 180 | |||
2882 | 181 | # ############################################################################# | ||
2883 | 109 | # Done. | 182 | # Done. |
2884 | 110 | # ############################################################################# | 183 | # ############################################################################# |
2885 | 111 | $sb->wipe_clean($master_dbh); | 184 | $sb->wipe_clean($master_dbh); |