]> git.ipfire.org Git - thirdparty/bugzilla.git/commitdiff
Bug 458390: Foreign Key names can be too long as currently designed
authormkanat%bugzilla.org <>
Wed, 5 Nov 2008 23:13:09 +0000 (23:13 +0000)
committermkanat%bugzilla.org <>
Wed, 5 Nov 2008 23:13:09 +0000 (23:13 +0000)
Patch By Max Kanat-Alexander <mkanat@bugzilla.org> r=ghendricks

Bugzilla/DB/Schema.pm
Bugzilla/DB/Schema/Oracle.pm

index 39f3caf2009b276f6dcbd577120f025a423cf2b9..02e4bfd0d3885f0624cf5bbc50f7f83d6fd3b9bd 100644 (file)
@@ -41,6 +41,7 @@ use Bugzilla::Util;
 use Bugzilla::Constants;
 
 use Carp qw(confess);
+use Digest::MD5 qw(md5_hex);
 use Hash::Util qw(lock_value unlock_hash lock_keys unlock_keys);
 use Safe;
 # Historical, needed for SCHEMA_VERSION = '1.00'
@@ -207,6 +208,8 @@ update this column in this table."
 
 use constant SCHEMA_VERSION  => '2.00';
 use constant ADD_COLUMN      => 'ADD COLUMN';
+# This is a reasonable default that's true for both PostgreSQL and MySQL.
+use constant MAX_IDENTIFIER_LEN => 63;
 use constant ABSTRACT_SCHEMA => {
 
     # BUG-RELATED TABLES
@@ -1544,9 +1547,23 @@ sub _get_fk_name {
     my ($self, $table, $column, $references) = @_;
     my $to_table  = $references->{TABLE}; 
     my $to_column = $references->{COLUMN};
-    return "fk_${table}_${column}_${to_table}_${to_column}";
+    my $name = "fk_${table}_${column}_${to_table}_${to_column}";
+
+    if (length($name) > $self->MAX_IDENTIFIER_LEN) {
+        $name = 'fk_' . $self->_hash_identifier($name);
+    }
+
+    return $name;
 }
 
+sub _hash_identifier {
+    my ($invocant, $value) = @_;
+    # We do -7 to allow prefixes like "idx_" or "fk_", or perhaps something
+    # longer in the future.
+    return substr(md5_hex($value), 0, $invocant->MAX_IDENTIFIER_LEN - 7);
+}
+
+
 sub get_add_fk_sql {
     my ($self, $table, $column, $def) = @_;
 
index ba3870a7667b70b51afaad85f16da927bb49e701..bd5c7247692ce780da967dd53863f5bed0f5260c 100644 (file)
@@ -32,10 +32,13 @@ use strict;
 
 use base qw(Bugzilla::DB::Schema);
 use Carp qw(confess);
-use Digest::MD5  qw(md5_hex);
 use Bugzilla::Util;
 
-use constant ADD_COLUMN      => 'ADD';
+use constant ADD_COLUMN => 'ADD';
+# Whether this is true or not, this is what it needs to be in order for
+# hash_identifier to maintain backwards compatibility with versions before
+# 3.2rc2.
+use constant MAX_IDENTIFIER_LEN => 27;
 
 #------------------------------------------------------------------------------
 sub _initialize {
@@ -105,7 +108,7 @@ sub get_table_ddl {
 sub _get_create_index_ddl {
 
     my ($self, $table_name, $index_name, $index_fields, $index_type) = @_;
-    $index_name = "idx_" . $self->_hash_index_name($index_name);
+    $index_name = "idx_" . $self->_hash_identifier($index_name);
     if ($index_type eq 'FULLTEXT') {
         my $sql = "CREATE INDEX $index_name ON $table_name (" 
                   . join(',',@$index_fields)
@@ -123,14 +126,10 @@ sub get_drop_index_ddl {
     my $self = shift;
     my ($table, $name) = @_;
 
-    $name = 'idx_' . $self->_hash_index_name($name);
+    $name = 'idx_' . $self->_hash_identifier($name);
     return $self->SUPER::get_drop_index_ddl($table, $name);
 }
 
-sub _hash_index_name {
-    return substr(md5_hex($_[1]),0,20);
-}
-
 # Oracle supports the use of FOREIGN KEY integrity constraints 
 # to define the referential integrity actions, including:
 # - Update and delete No Action (default)
@@ -187,7 +186,7 @@ sub _get_fk_name {
     my $to_table  = $references->{TABLE};
     my $to_column = $references->{COLUMN};
     my $fk_name   = "${table}_${column}_${to_table}_${to_column}";
-    $fk_name      = "fk_" . $self->_hash_index_name($fk_name);
+    $fk_name      = "fk_" . $self->_hash_identifier($fk_name);
     
     return $fk_name;
 }