Fixed #12977 -- Ensure that indexes don't exceed character limits on MySQL. Thanks to carljm for the original report, and hgeerts@osso.nl for the patch.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@13040 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
Russell Keith-Magee 2010-04-28 12:08:30 +00:00
parent 4e0aa65d16
commit 9d8492c169
2 changed files with 7 additions and 1 deletions

View File

@ -260,6 +260,8 @@ class BaseDatabaseCreation(object):
def sql_indexes_for_field(self, model, f, style): def sql_indexes_for_field(self, model, f, style):
"Return the CREATE INDEX SQL statements for a single model field" "Return the CREATE INDEX SQL statements for a single model field"
from django.db.backends.util import truncate_name
if f.db_index and not f.unique: if f.db_index and not f.unique:
qn = self.connection.ops.quote_name qn = self.connection.ops.quote_name
tablespace = f.db_tablespace or model._meta.db_tablespace tablespace = f.db_tablespace or model._meta.db_tablespace
@ -271,8 +273,9 @@ class BaseDatabaseCreation(object):
tablespace_sql = '' tablespace_sql = ''
else: else:
tablespace_sql = '' tablespace_sql = ''
i_name = '%s_%s' % (model._meta.db_table, self._digest(f.column))
output = [style.SQL_KEYWORD('CREATE INDEX') + ' ' + output = [style.SQL_KEYWORD('CREATE INDEX') + ' ' +
style.SQL_TABLE(qn('%s_%s' % (model._meta.db_table, f.column))) + ' ' + style.SQL_TABLE(qn(truncate_name(i_name, self.connection.ops.max_name_length()))) + ' ' +
style.SQL_KEYWORD('ON') + ' ' + style.SQL_KEYWORD('ON') + ' ' +
style.SQL_TABLE(qn(model._meta.db_table)) + ' ' + style.SQL_TABLE(qn(model._meta.db_table)) + ' ' +
"(%s)" % style.SQL_FIELD(qn(f.column)) + "(%s)" % style.SQL_FIELD(qn(f.column)) +

View File

@ -227,6 +227,9 @@ class DatabaseOperations(BaseDatabaseOperations):
second = '%s-12-31 23:59:59.99' second = '%s-12-31 23:59:59.99'
return [first % value, second % value] return [first % value, second % value]
def max_name_length(self):
return 64
class DatabaseWrapper(BaseDatabaseWrapper): class DatabaseWrapper(BaseDatabaseWrapper):
operators = { operators = {