From: Peter Rabbitson Date: Tue, 23 Feb 2010 10:41:28 +0000 (+0000) Subject: changing SQL::Translator::Diff to use producer_args instead of producer_options X-Git-Tag: v0.11008~66 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=1f5b262589ef8c70f7e2f15a53bab396c71f8ade;p=dbsrgits%2FSQL-Translator.git changing SQL::Translator::Diff to use producer_args instead of producer_options Use Carp instead of warn and fix noisy tests Release 0.11004 Patch by Dan Horne (RT#49413) Add primary key index type support to mysql grammar Make PG-parser trace subject to debug (RT#52276) Extend test a bit (the btree seems to be discarded atm) Support commit; in loaded Pg DDL Changes r1657@Thesaurus (orig r1656): acmoore | 2010-02-10 17:52:41 +0100 r1661@Thesaurus (orig r1660): rabbit | 2010-02-14 10:22:53 +0100 r1662@Thesaurus (orig r1661): rabbit | 2010-02-14 10:45:33 +0100 r1663@Thesaurus (orig r1662): rabbit | 2010-02-14 10:54:24 +0100 r1664@Thesaurus (orig r1663): rabbit | 2010-02-14 11:06:41 +0100 r1665@Thesaurus (orig r1664): rabbit | 2010-02-14 11:13:51 +0100 r1666@Thesaurus (orig r1665): rabbit | 2010-02-14 11:26:57 +0100 r1667@Thesaurus (orig r1666): rabbit | 2010-02-14 11:29:13 +0100 r1668@Thesaurus (orig r1667): rabbit | 2010-02-14 11:38:23 +0100 --- diff --git a/AUTHORS b/AUTHORS index c592767..306c7cf 100644 --- a/AUTHORS +++ b/AUTHORS @@ -3,6 +3,7 @@ The following people have contributed to the SQLFairy project: - Alexander Hartmaier - Allen Day - Anders Nor Berle +- Andrew Moore - Ben Faga - Chris Hilton - Chris Mungall diff --git a/Changes b/Changes index e1a2946..79df63d 100644 --- a/Changes +++ b/Changes @@ -1,7 +1,16 @@ +* Fix Parser::DBI::Oracle reading too many tables (RT#49413) +* Fix Parser::MySQL tripping up on PRIMARY KEY ... USING (currently value is ignored) (RT#50468) +* Fix runaway debug trace (RT#52276) +* Fix Parser::PostgreSQL choking on commit; statements in DDL (#RT52277) + +# ---------------------------------------------------------- +# 0.11004 2010-02-14 +# ---------------------------------------------------------- * Fix PG producer numeric precision regression (RT#49301) * Add DB2 producer numeric/decimal precision output * Fix Oracle producer creating numeric precision statements that the test case expects (no whitespace) * Add Oracle producer creating drop view statements like PG producer does +* Fix SQL::Translator::Diff to use producer_args instead of producer_options # ---------------------------------------------------------- # 0.11003 2009-09-28 diff --git a/lib/SQL/Translator.pm b/lib/SQL/Translator.pm index 1fe18c0..bf94103 100644 --- a/lib/SQL/Translator.pm +++ b/lib/SQL/Translator.pm @@ -24,7 +24,7 @@ use base 'Class::Base'; require 5.005; -$VERSION = '0.11003'; +$VERSION = '0.11004'; $DEBUG = 0 unless defined $DEBUG; $ERROR = ""; diff --git a/lib/SQL/Translator/Diff.pm b/lib/SQL/Translator/Diff.pm index 91b8c1a..4c9ea77 100644 --- a/lib/SQL/Translator/Diff.pm +++ b/lib/SQL/Translator/Diff.pm @@ -6,6 +6,7 @@ use strict; use warnings; use Data::Dumper; +use Carp::Clan qw/^SQL::Translator/; use SQL::Translator::Schema::Constants; use base 'Class::Accessor::Fast'; @@ -14,7 +15,7 @@ use base 'Class::Accessor::Fast'; __PACKAGE__->mk_accessors(qw/ ignore_index_names ignore_constraint_names ignore_view_sql ignore_proc_sql output_db source_schema target_schema - case_insensitive no_batch_alters ignore_missing_methods producer_options + case_insensitive no_batch_alters ignore_missing_methods producer_args /); my @diff_arrays = qw/ @@ -63,7 +64,11 @@ sub new { $values->{$_} ||= [] foreach @diff_arrays; $values->{table_diff_hash} = {}; - $values->{producer_options} ||= {}; + $values->{producer_args} ||= {}; + if ($values->{producer_options}) { + carp 'producer_options is deprecated. Please use producer_args'; + $values->{producer_args} = { %{$values->{producer_options}}, %{$values->{producer_args}} }; + } $values->{output_db} ||= $values->{source_db}; return $class->SUPER::new($values); } @@ -101,7 +106,7 @@ sub compute_differences { $self->table_diff_hash->{$tar_table_name}{table_renamed_from} = [ [$src_table, $tar_table] ]; } else { delete $tar_table->extra->{renamed_from}; - warn qq#Renamed table can't find old table "$old_name" for renamed table\n#; + carp qq#Renamed table can't find old table "$old_name" for renamed table\n#; } } else { $src_table = $source_schema->get_table( $tar_table_name, $self->case_insensitive ); @@ -181,7 +186,7 @@ sub produce_diff_sql { $func_map{$_} => $self->table_diff_hash->{$table}{$_} } keys %func_map }, - $self->producer_options + $self->producer_args ); } } else { @@ -200,7 +205,7 @@ sub produce_diff_sql { my $meth = $producer_class->can($_); $meth ? map { - my $sql = $meth->( (ref $_ eq 'ARRAY' ? @$_ : $_), $self->producer_options ); + my $sql = $meth->( (ref $_ eq 'ARRAY' ? @$_ : $_), $self->producer_args ); $sql ? ("$sql") : (); } @{ $flattened_diffs{$_} } : $self->ignore_missing_methods @@ -226,7 +231,7 @@ sub produce_diff_sql { add_drop_table => 0, no_comments => 1, # TODO: sort out options - %{ $self->producer_options } + %{ $self->producer_args } ); $translator->producer_args->{no_transaction} = 1; my $schema = $translator->schema; @@ -241,7 +246,7 @@ sub produce_diff_sql { if (my @tables_to_drop = @{ $self->{tables_to_drop} || []} ) { my $meth = $producer_class->can('drop_table'); - push @diffs, $meth ? ( map { $meth->($_, $self->producer_options) } @tables_to_drop) + push @diffs, $meth ? ( map { $meth->($_, $self->producer_args) } @tables_to_drop) : $self->ignore_missing_methods ? "-- $producer_class cant drop_table" : die "$producer_class cant drop_table"; @@ -343,7 +348,7 @@ sub diff_table_fields { if (my $old_name = $tar_table_field->extra->{renamed_from}) { my $src_table_field = $src_table->get_field( $old_name, $self->case_insensitive ); unless ($src_table_field) { - warn qq#Renamed column can't find old column "@{[$src_table->name]}.$old_name" for renamed column\n#; + carp qq#Renamed column can't find old column "@{[$src_table->name]}.$old_name" for renamed column\n#; delete $tar_table_field->extra->{renamed_from}; } else { push @{$self->table_diff_hash->{$tar_table}{fields_to_rename} }, [ $src_table_field, $tar_table_field ]; @@ -406,6 +411,13 @@ sub diff_table_options { unless $src_table->_compare_objects( \@src_opts, \@tar_opts ); } +# support producer_options as an alias for producer_args for legacy code. +sub producer_options { + my $self = shift; + + return $self->producer_args( @_ ); +} + 1; __END__ diff --git a/lib/SQL/Translator/Parser/DBI/Oracle.pm b/lib/SQL/Translator/Parser/DBI/Oracle.pm index d111387..c853a81 100644 --- a/lib/SQL/Translator/Parser/DBI/Oracle.pm +++ b/lib/SQL/Translator/Parser/DBI/Oracle.pm @@ -48,10 +48,10 @@ sub parse { my $schema = $tr->schema; - my $sth = $dbh->table_info(); + my $db_user = uc $tr->parser_args()->{db_user}; + my $sth = $dbh->table_info(undef, $db_user, '%', 'TABLE'); while(my $table_info = $sth->fetchrow_hashref('NAME_uc')) { - next unless ($table_info->{TABLE_TYPE} eq 'TABLE'); next if ($table_info->{TABLE_NAME} =~ /\$/); # create the table diff --git a/lib/SQL/Translator/Parser/DBI/PostgreSQL.pm b/lib/SQL/Translator/Parser/DBI/PostgreSQL.pm index 9606651..86c66d7 100644 --- a/lib/SQL/Translator/Parser/DBI/PostgreSQL.pm +++ b/lib/SQL/Translator/Parser/DBI/PostgreSQL.pm @@ -184,7 +184,7 @@ ORDER BY 1; $fk_select->execute('public',$table_name) or die "Can't execute: $@"; my $fkeys = $fk_select->fetchall_arrayref({}); - print Dumper $fkeys; + $DEBUG and print Dumper $fkeys; for my $con (@$fkeys){ my $con_name = $con->{conname}; my $fields = $con->{fields}; diff --git a/lib/SQL/Translator/Parser/MySQL.pm b/lib/SQL/Translator/Parser/MySQL.pm index 38b062b..fdd27a2 100644 --- a/lib/SQL/Translator/Parser/MySQL.pm +++ b/lib/SQL/Translator/Parser/MySQL.pm @@ -641,13 +641,14 @@ foreign_key_def_begin : /constraint/i /foreign key/i WORD /foreign key/i { $return = '' } -primary_key_def : primary_key index_name(?) '(' name_with_opt_paren(s /,/) ')' +primary_key_def : primary_key index_name(?) '(' name_with_opt_paren(s /,/) ')' index_type(?) { $return = { supertype => 'constraint', name => $item{'index_name(?)'}[0], type => 'primary_key', fields => $item[4], + options => $item[6][0], }; } diff --git a/lib/SQL/Translator/Parser/PostgreSQL.pm b/lib/SQL/Translator/Parser/PostgreSQL.pm index 071a0a1..a80021e 100644 --- a/lib/SQL/Translator/Parser/PostgreSQL.pm +++ b/lib/SQL/Translator/Parser/PostgreSQL.pm @@ -152,8 +152,11 @@ statement : create | select | copy | readin_symbol + | commit | +commit : /commit/i ';' + connect : /^\s*\\\connect.*\n/ set : /set/i /[^;]*/ ';' diff --git a/t/02mysql-parser.t b/t/02mysql-parser.t index 4c2ae2a..2e1fa45 100644 --- a/t/02mysql-parser.t +++ b/t/02mysql-parser.t @@ -234,7 +234,7 @@ BEGIN { tax decimal(8,2), shipping_charge decimal(8,2), price_paid decimal(8,2), - PRIMARY KEY (order_id), + PRIMARY KEY (order_id) USING BTREE, KEY (status), KEY (billing_address_id), KEY (shipping_address_id), diff --git a/t/14postgres-parser.t b/t/14postgres-parser.t index 1683a8b..3d29196 100644 --- a/t/14postgres-parser.t +++ b/t/14postgres-parser.t @@ -91,6 +91,8 @@ my $sql = q[ alter table only t_test1 drop constraint foo cascade; alter table t_test1 owner to foo; + + commit; ]; $| = 1; diff --git a/t/30sqlt-new-diff-mysql.t b/t/30sqlt-new-diff-mysql.t index edeaa21..a3ed806 100644 --- a/t/30sqlt-new-diff-mysql.t +++ b/t/30sqlt-new-diff-mysql.t @@ -39,7 +39,7 @@ my @out = SQL::Translator::Diff::schema_diff( $target_schema, 'MySQL', { no_batch_alters => 1, - producer_options => { quote_table_names => 0 } + producer_args => { quote_table_names => 0 } } ); @@ -106,7 +106,7 @@ COMMIT; $out = SQL::Translator::Diff::schema_diff($source_schema, 'MySQL', $target_schema, 'MySQL', { ignore_index_names => 1, ignore_constraint_names => 1, - producer_options => { quote_table_names => 0 }, + producer_args => { quote_table_names => 0 }, }); eq_or_diff($out, <<'## END OF DIFF', "Diff as expected"); @@ -178,7 +178,7 @@ eq_or_diff($out, <<'## END OF DIFF', "No differences found"); my $field = $target_schema->get_table('employee')->get_field('employee_id'); $field->data_type('integer'); $field->size(0); - $out = SQL::Translator::Diff::schema_diff($schema, 'MySQL', $target_schema, 'MySQL', { producer_options => { quote_table_names => 0 } } ); + $out = SQL::Translator::Diff::schema_diff($schema, 'MySQL', $target_schema, 'MySQL', { producer_args => { quote_table_names => 0 } } ); eq_or_diff($out, <<'## END OF DIFF', "No differences found"); -- Convert schema 'create.sql' to 'create2.yml':; @@ -316,7 +316,7 @@ COMMIT; # Test quoting works too. $out = SQL::Translator::Diff::schema_diff($s1, 'MySQL', $s2, 'MySQL', - { producer_options => { quote_table_names => '`' } } + { producer_args => { quote_table_names => '`' } } ); eq_or_diff($out, <<'## END OF DIFF', "Quoting can be turned on"); -- Convert schema 'Schema 3' to 'Schema 4':; diff --git a/t/30sqlt-new-diff-pgsql.t b/t/30sqlt-new-diff-pgsql.t index 0481a60..3a2c957 100644 --- a/t/30sqlt-new-diff-pgsql.t +++ b/t/30sqlt-new-diff-pgsql.t @@ -40,7 +40,7 @@ my $out = SQL::Translator::Diff::schema_diff( $target_schema, 'PostgreSQL', { - producer_options => { + producer_args => { quote_table_names => 0, } } @@ -98,7 +98,7 @@ $out = SQL::Translator::Diff::schema_diff( $source_schema, 'PostgreSQL', $target_schema, 'PostgreSQL', { ignore_index_names => 1, ignore_constraint_names => 1, - producer_options => { + producer_args => { quote_table_names => 0, quote_field_names => 0, } diff --git a/t/data/mysql/create.sql b/t/data/mysql/create.sql index e8c955e..642d9a2 100644 --- a/t/data/mysql/create.sql +++ b/t/data/mysql/create.sql @@ -15,7 +15,7 @@ create table employee ( employee_id integer, job_title varchar(255), CONSTRAINT FK5302D47D93FE702E FOREIGN KEY (employee_id) REFERENCES person (person_id), - PRIMARY KEY (position, employee_id) + PRIMARY KEY (position, employee_id) USING BTREE ) ENGINE=InnoDB; create table deleted (