X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FSQL%2FTranslator%2FProducer%2FPostgreSQL.pm;h=17924f3c33fd233e1974f41c7b83941c3c24fd8d;hb=3406fd5b1839f1e6d165ae39b86e08effc80ac2c;hp=495f529fee5c6572b57dd5dc80f38b08150232c5;hpb=6d80a12008c5cdb4690201259bd4323f55ec6712;p=dbsrgits%2FSQL-Translator.git diff --git a/lib/SQL/Translator/Producer/PostgreSQL.pm b/lib/SQL/Translator/Producer/PostgreSQL.pm index 495f529..17924f3 100644 --- a/lib/SQL/Translator/Producer/PostgreSQL.pm +++ b/lib/SQL/Translator/Producer/PostgreSQL.pm @@ -217,10 +217,10 @@ sub produce { }); } - $output = join("\n\n", @table_defs); + $output = join(";\n\n", @table_defs) . ";\n\n"; if ( @fks ) { $output .= "--\n-- Foreign Key Definitions\n--\n\n" unless $no_comments; - $output .= join( "\n\n", @fks ) . "\n"; + $output .= join( ";\n\n", @fks ) . ";\n"; } if ( $WARN ) { @@ -327,9 +327,12 @@ sub create_table my $add_drop_table = $options->{add_drop_table} || 0; my $postgres_version = $options->{postgres_version} || 0; - my $table_name = $table->name or next; - $table_name = mk_name( $table_name, '', undef, 1 ); - my $table_name_ur = $qt ? $table_name : unreserve($table_name); + my $table_name = $table->name or next; + $table_name = mk_name( $table_name, '', undef, 1 ); + my ( $fql_tbl_name ) = ( $table_name =~ s/\W(.*)$// ) ? $1 : q{}; + my $table_name_ur = $qt ? $table_name + : $fql_tbl_name ? join('.', $table_name, unreserve($fql_tbl_name)) + : unreserve($table_name); $table->name($table_name_ur); # print STDERR "$table_name table_name\n"; @@ -404,11 +407,12 @@ sub create_table if $postgres_version >= 8.3; $create_statement .= qq[CREATE TABLE $qt$table_name_ur$qt (\n]. join( ",\n", map { " $_" } @field_defs, @constraint_defs ). - "\n);" + "\n)" ; + $create_statement .= @index_defs ? ';' : q{}; + $create_statement .= ( $create_statement =~ /;$/ ? "\n" : q{} ) + . join(";\n", @index_defs); - $create_statement .= "\n" . join("\n", @index_defs) . "\n"; - return $create_statement, \@fks; } @@ -444,7 +448,6 @@ sub create_view { $create .= ' WITH ' . uc $extra->{check_option} . ' CHECK OPTION'; } - $create .= ";\n\n"; return $create; } @@ -489,8 +492,8 @@ sub create_view { if ($postgres_version >= 8.3 && $field->data_type eq 'enum') { my $type_name = $field->table->name . '_' . $field->name . '_type'; $field_def .= ' '. $type_name; - push @$type_defs, "CREATE TYPE $type_name AS ENUM ($commalist);"; - push @$type_drops, "DROP TYPE IF EXISTS $type_name;"; + push @$type_defs, "CREATE TYPE $type_name AS ENUM ($commalist)"; + push @$type_drops, "DROP TYPE IF EXISTS $type_name"; } else { $field_def .= ' '. convert_datatype($field); } @@ -543,7 +546,7 @@ sub create_view { $index->fields; next unless @fields; - my $def_start = qq[Constraint "$name" ]; + my $def_start = qq[CONSTRAINT "$name" ]; if ( $type eq PRIMARY_KEY ) { push @constraint_defs, "${def_start}PRIMARY KEY ". '(' .$qf . join( $qf. ', '.$qf, @fields ) . $qf . ')'; @@ -556,7 +559,7 @@ sub create_view { $index_def = "CREATE INDEX ${qf}${name}${qf} on ${qt}${table_name}${qt} (". join( ', ', map { qq[$qf$_$qf] } @fields ). - ');' + ')' ; } else { @@ -592,7 +595,7 @@ sub create_view { $c->reference_fields; next if !@fields && $c->type ne CHECK_C; - my $def_start = $name ? qq[Constraint "$name" ] : ''; + my $def_start = $name ? qq[CONSTRAINT "$name" ] : ''; if ( $c->type eq PRIMARY_KEY ) { push @constraint_defs, "${def_start}PRIMARY KEY ". '('.$qf . join( $qf.', '.$qf, @fields ) . $qf.')'; @@ -632,7 +635,7 @@ sub create_view { $def .= ' DEFERRABLE'; } - push @fks, "$def;"; + push @fks, "$def"; } return \@constraint_defs, \@fks; @@ -650,7 +653,7 @@ sub convert_datatype # $len = ($len < length($_)) ? length($_) : $len for (@$list); # my $chk_name = mk_name( $table_name.'_'.$field_name, 'chk' ); # push @$constraint_defs, -# qq[Constraint "$chk_name" CHECK ($qf$field_name$qf ]. +# qq[CONSTRAINT "$chk_name" CHECK ($qf$field_name$qf ]. # qq[IN ($commalist))]; $data_type = 'character varying'; } @@ -723,39 +726,42 @@ sub alter_field if($from_field->table->name ne $to_field->table->name); my @out; - push @out, sprintf('ALTER TABLE %s ALTER COLUMN %s SET NOT NULL;', + push @out, sprintf('ALTER TABLE %s ALTER COLUMN %s SET NOT NULL', $to_field->table->name, $to_field->name) if(!$to_field->is_nullable and $from_field->is_nullable); my $from_dt = convert_datatype($from_field); my $to_dt = convert_datatype($to_field); - push @out, sprintf('ALTER TABLE %s ALTER COLUMN %s TYPE %s;', + push @out, sprintf('ALTER TABLE %s ALTER COLUMN %s TYPE %s', $to_field->table->name, $to_field->name, $to_dt) if($to_dt ne $from_dt); - push @out, sprintf('ALTER TABLE %s RENAME COLUMN %s TO %s;', + push @out, sprintf('ALTER TABLE %s RENAME COLUMN %s TO %s', $to_field->table->name, $from_field->name, $to_field->name) if($from_field->name ne $to_field->name); - push @out, sprintf('ALTER TABLE %s ALTER COLUMN %s SET DEFAULT %s;', + my $old_default = $from_field->default_value; + my $new_default = $to_field->default_value; + push @out, sprintf('ALTER TABLE %s ALTER COLUMN %s SET DEFAULT %s', $to_field->table->name, $to_field->name, - $to_field->default_value) - if(defined $to_field->default_value && - $from_field->default_value ne $to_field->default_value); + $to_field->default_value) + if ( defined $new_default && + (!defined $old_default || $old_default ne $new_default) ); return wantarray ? @out : join("\n", @out); - } +sub rename_field { alter_field(@_) } + sub add_field { my ($new_field) = @_; - my $out = sprintf('ALTER TABLE %s ADD COLUMN %s;', + my $out = sprintf('ALTER TABLE %s ADD COLUMN %s', $new_field->table->name, create_field($new_field)); return $out; @@ -766,13 +772,76 @@ sub drop_field { my ($old_field) = @_; - my $out = sprintf('ALTER TABLE %s DROP COLUMN %s;', + my $out = sprintf('ALTER TABLE %s DROP COLUMN %s', $old_field->table->name, $old_field->name); return $out; } +sub alter_table { + my ($to_table, $options) = @_; + my $qt = $options->{quote_table_names} || ''; + my $out = sprintf('ALTER TABLE %s %s', + $qt . $to_table->name . $qt, + $options->{alter_table_action}); + return $out; +} + +sub rename_table { + my ($old_table, $new_table, $options) = @_; + my $qt = $options->{quote_table_names} || ''; + $options->{alter_table_action} = "RENAME TO $qt$new_table$qt"; + return alter_table($old_table, $options); +} + +sub alter_create_index { + my ($index, $options) = @_; + my $qt = $options->{quote_table_names} || ''; + my $qf = $options->{quote_field_names} || ''; + my ($idef, $constraints) = create_index($index, { + quote_field_names => $qf, + quote_table_names => $qt, + table_name => $index->table->name, + }); + return $index->type eq NORMAL ? $idef + : sprintf('ALTER TABLE %s ADD %s', + $qt . $index->table->name . $qt, + join(q{}, @$constraints) + ); +} + +sub alter_drop_index { + my ($index, $options) = @_; + my $index_name = $index->name; + return "DROP INDEX $index_name"; +} + +sub alter_drop_constraint { + my ($c, $options) = @_; + my $qt = $options->{quote_table_names} || ''; + my $qc = $options->{quote_field_names} || ''; + my $out = sprintf('ALTER TABLE %s DROP CONSTRAINT %s', + $qt . $c->table->name . $qt, + $qc . $c->name . $qc ); + return $out; +} + +sub alter_create_constraint { + my ($index, $options) = @_; + my $qt = $options->{quote_table_names} || ''; + return $index->type eq FOREIGN_KEY ? join(q{}, @{create_constraint(@_)}) + : join( ' ', 'ALTER TABLE', $qt.$index->table->name.$qt, + 'ADD', join(q{}, map { @{$_} } create_constraint(@_)) + ); +} + +sub drop_table { + my ($table, $options) = @_; + my $qt = $options->{quote_table_names} || ''; + return "DROP TABLE $qt$table$qt CASCADE"; +} + 1; # -------------------------------------------------------------------