Commit f9df4d14 authored by Malcolm Tredinnick's avatar Malcolm Tredinnick
Browse files

Make sure we only create the minimum number of table indexes for MySQL.

This patch simplifies a bunch of code for all backends and removes some
duplicate index creation for MySQL, in particular (versions 4.x and later).
Patch from Nis Jørgensen.

Fixed #5671, #5680, #7170, #7186.


git-svn-id: http://code.djangoproject.com/svn/django/trunk@7790 bcc190cf-cafb-0310-a4f2-bffc1f526a37
parent b0bc8b9d
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -192,6 +192,7 @@ answer newbie questions, and generally made Django that much better:
    james_027@yahoo.com
    jcrasta@gmail.com
    Zak Johnson <zakj@nox.cx>
    Nis Jørgensen <nis@superlativ.dk>
    Michael Josephson <http://www.sdjournal.com/>
    jpellerin@gmail.com
    junzhang.jn@gmail.com
+2 −2
Original line number Diff line number Diff line
@@ -21,10 +21,10 @@ class Command(LabelCommand):
        for f in fields:
            field_output = [qn(f.name), f.db_type()]
            field_output.append("%sNULL" % (not f.null and "NOT " or ""))
            if f.unique:
                field_output.append("UNIQUE")
            if f.primary_key:
                field_output.append("PRIMARY KEY")
            elif f.unique:
                field_output.append("UNIQUE")
            if f.db_index:
                unique = f.unique and "UNIQUE " or ""
                index_output.append("CREATE %sINDEX %s_%s ON %s (%s);" % \
+6 −7
Original line number Diff line number Diff line
@@ -268,11 +268,11 @@ def sql_model_create(model, style, known_models=set()):
        field_output = [style.SQL_FIELD(qn(f.column)),
            style.SQL_COLTYPE(col_type)]
        field_output.append(style.SQL_KEYWORD('%sNULL' % (not f.null and 'NOT ' or '')))
        if f.unique and (not f.primary_key or connection.features.allows_unique_and_pk):
            field_output.append(style.SQL_KEYWORD('UNIQUE'))
        if f.primary_key:
            field_output.append(style.SQL_KEYWORD('PRIMARY KEY'))
        if tablespace and connection.features.supports_tablespaces and (f.unique or f.primary_key) and connection.features.autoindexes_primary_keys:
        elif f.unique:
            field_output.append(style.SQL_KEYWORD('UNIQUE'))
        if tablespace and connection.features.supports_tablespaces and f.unique:
            # We must specify the index tablespace inline, because we
            # won't be generating a CREATE INDEX statement for this field.
            field_output.append(connection.ops.tablespace_sql(tablespace, inline=True))
@@ -355,7 +355,7 @@ def many_to_many_sql_for_model(model, style):
    for f in opts.local_many_to_many:
        if not isinstance(f.rel, generic.GenericRel):
            tablespace = f.db_tablespace or opts.db_tablespace
            if tablespace and connection.features.supports_tablespaces and connection.features.autoindexes_primary_keys:
            if tablespace and connection.features.supports_tablespaces: 
                tablespace_sql = ' ' + connection.ops.tablespace_sql(tablespace, inline=True)
            else:
                tablespace_sql = ''
@@ -460,15 +460,14 @@ def sql_indexes_for_model(model, style):

    qn = connection.ops.quote_name
    for f in model._meta.local_fields:
        if f.db_index and not ((f.primary_key or f.unique) and connection.features.autoindexes_primary_keys):
            unique = f.unique and 'UNIQUE ' or ''
        if f.db_index and not f.unique:
            tablespace = f.db_tablespace or model._meta.db_tablespace
            if tablespace and connection.features.supports_tablespaces:
                tablespace_sql = ' ' + connection.ops.tablespace_sql(tablespace)
            else:
                tablespace_sql = ''
            output.append(
                style.SQL_KEYWORD('CREATE %sINDEX' % unique) + ' ' + \
                style.SQL_KEYWORD('CREATE INDEX') + ' ' + \
                style.SQL_TABLE(qn('%s_%s' % (model._meta.db_table, f.column))) + ' ' + \
                style.SQL_KEYWORD('ON') + ' ' + \
                style.SQL_TABLE(qn(model._meta.db_table)) + ' ' + \
+0 −2
Original line number Diff line number Diff line
@@ -41,8 +41,6 @@ class BaseDatabaseWrapper(local):

class BaseDatabaseFeatures(object):
    allows_group_by_ordinal = True
    allows_unique_and_pk = True
    autoindexes_primary_keys = True
    inline_fk_references = True
    needs_datetime_string_cast = True
    supports_constraints = True
+0 −1
Original line number Diff line number Diff line
@@ -60,7 +60,6 @@ server_version_re = re.compile(r'(\d{1,2})\.(\d{1,2})\.(\d{1,2})')
# TRADITIONAL will automatically cause most warnings to be treated as errors.

class DatabaseFeatures(BaseDatabaseFeatures):
    autoindexes_primary_keys = False
    inline_fk_references = False
    empty_fetchmany_value = ()
    update_can_self_select = False
Loading