Alzabo
view release on metacpan or search on metacpan
lib/Alzabo/RDBMSRules/PostgreSQL.pm view on Meta::CPAN
$self->{state}{rename_sequence_sql}{ $p{new}->name } = 1;
return @sql;
}
sub drop_foreign_key_sql
{
my $self = shift;
my $fk = shift;
if ( grep { $_->is_primary_key } $fk->columns_from )
{
return unless $fk->from_is_dependent;
}
return () if $self->{state}{drop_fk_sql}{ $fk->id };
$self->{state}{drop_fk_sql}{ $fk->id } = 1;
return 'ALTER TABLE "' . $fk->table_from->name . '" DROP CONSTRAINT '
. $self->_fk_name($fk);
}
sub drop_index_sql
{
my $self = shift;
my $index = shift;
return 'DROP INDEX "' . $index->id . '"';
}
sub column_sql_add
{
my $self = shift;
my $col = shift;
return () if $self->{state}{table_sql}{ $col->table->name };
# Skip default and not null while adding column
my @sql = 'ALTER TABLE "' . $col->table->name . '" ADD COLUMN ' . $self->column_sql($col, { skip_default => 1, skip_nullable => 1 });
my $def = $self->_default_for_column($col);
if ($def)
{
push @sql,
( 'ALTER TABLE "' . $col->table->name . '" ALTER COLUMN "' .
$col->name . qq|" SET DEFAULT $def| );
}
if ( ! $col->nullable )
{
push @sql,
( 'UPDATE "' . $col->table->name
. '" SET "' . $col->name . qq|" = $def WHERE "|
. $col->name . '" IS NULL'
);
push @sql,
( 'ALTER TABLE "' . $col->table->name
. '" ADD CONSTRAINT "'
. $col->table->name . '_' . $col->name . '_not_null" CHECK ( "'
. $col->name . '" IS NOT NULL )'
);
}
return @sql;
}
sub column_sql_diff
{
my $self = shift;
my %p = @_;
return $self->drop_column_sql( new_table => $p{new}->table,
old => $p{old} )
unless $self->_columns_are_equivalent( $p{new}, $p{old} );
return;
}
sub _columns_are_equivalent
{
my $self = shift;
my $new = shift;
my $old = shift;
return 0 unless $self->_types_are_equivalent( $new, $old );
return 0 unless $self->_defaults_are_equivalent( $new, $old );
return 0 unless $new->sequenced == $old->sequenced;
my $new_att = join "\0", sort $new->attributes;
$new_att ||= '';
my $old_att = join "\0", sort $old->attributes;
$old_att ||= '';
return 0 unless $new_att eq $old_att;
return 1;
}
{
my %CanonicalTypes =
( BOOL => 'BOOLEAN',
INT => 'INTEGER',
INT4 => 'INTEGER',
INT2 => 'SMALLINT',
INT8 => 'BIGINT',
VARBIT => 'BIT VARYING',
VARCHAR => 'CHARACTER VARYING',
CHAR => 'CHARACTER',
FLOAT => 'DOUBLE PRECISION',
FLOAT8 => 'DOUBLE PRECISION',
FLOAT4 => 'REAL',
DECIMAL => 'NUMERIC',
);
sub _types_are_equivalent
{
( run in 0.474 second using v1.01-cache-2.11-cpan-ceb78f64989 )