Commit fa972248 authored by Adrian Holovaty's avatar Adrian Holovaty
Browse files

Fixed #2061 -- Fixed PostgreSQL index introspection in tables that have...

Fixed #2061 -- Fixed PostgreSQL index introspection in tables that have dropped columns. Thanks, Chris Chamberlin

git-svn-id: http://code.djangoproject.com/svn/django/trunk@3047 bcc190cf-cafb-0310-a4f2-bffc1f526a37
parent 8cd32bdd
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -45,6 +45,7 @@ answer newbie questions, and generally made Django that much better:
    andy@jadedplanet.net
    Antonio Cavedoni <http://cavedoni.com/>
    C8E
    Chris Chamberlin <dja@cdc.msbx.net>
    Amit Chakradeo <http://amit.chakradeo.net/>
    ChaosKCW
    Ian Clelland <clelland@gmail.com>
+9 −10
Original line number Diff line number Diff line
@@ -45,27 +45,26 @@ def get_indexes(cursor, table_name):
        {'primary_key': boolean representing whether it's the primary key,
         'unique': boolean representing whether it's a unique index}
    """
    # Get the table description because we only have the column indexes, and we
    # need the column names.
    desc = get_table_description(cursor, table_name)
    # This query retrieves each index on the given table.
    # This query retrieves each index on the given table, including the
    # first associated field name
    cursor.execute("""
        SELECT idx.indkey, idx.indisunique, idx.indisprimary
        SELECT attr.attname, idx.indkey, idx.indisunique, idx.indisprimary
        FROM pg_catalog.pg_class c, pg_catalog.pg_class c2,
            pg_catalog.pg_index idx
            pg_catalog.pg_index idx, pg_catalog.pg_attribute attr
        WHERE c.oid = idx.indrelid
            AND idx.indexrelid = c2.oid
            AND attr.attrelid = c.oid
            AND attr.attnum = idx.indkey[0]
            AND c.relname = %s""", [table_name])
    indexes = {}
    for row in cursor.fetchall():
        # row[0] (idx.indkey) is stored in the DB as an array. It comes out as
        # row[1] (idx.indkey) is stored in the DB as an array. It comes out as
        # a string of space-separated integers. This designates the field
        # indexes (1-based) of the fields that have indexes on the table.
        # Here, we skip any indexes across multiple fields.
        if ' ' in row[0]:
        if ' ' in row[1]:
            continue
        col_name = desc[int(row[0])-1][0]
        indexes[col_name] = {'primary_key': row[2], 'unique': row[1]}
        indexes[row[0]] = {'primary_key': row[3], 'unique': row[2]}
    return indexes

# Maps type codes to Django Field types.
+9 −10
Original line number Diff line number Diff line
@@ -45,27 +45,26 @@ def get_indexes(cursor, table_name):
        {'primary_key': boolean representing whether it's the primary key,
         'unique': boolean representing whether it's a unique index}
    """
    # Get the table description because we only have the column indexes, and we
    # need the column names.
    desc = get_table_description(cursor, table_name)
    # This query retrieves each index on the given table.
    # This query retrieves each index on the given table, including the
    # first associated field name
    cursor.execute("""
        SELECT idx.indkey, idx.indisunique, idx.indisprimary
        SELECT attr.attname, idx.indkey, idx.indisunique, idx.indisprimary
        FROM pg_catalog.pg_class c, pg_catalog.pg_class c2,
            pg_catalog.pg_index idx
            pg_catalog.pg_index idx, pg_catalog.pg_attribute attr
        WHERE c.oid = idx.indrelid
            AND idx.indexrelid = c2.oid
            AND attr.attrelid = c.oid
            AND attr.attnum = idx.indkey[0]
            AND c.relname = %s""", [table_name])
    indexes = {}
    for row in cursor.fetchall():
        # row[0] (idx.indkey) is stored in the DB as an array. It comes out as
        # row[1] (idx.indkey) is stored in the DB as an array. It comes out as
        # a string of space-separated integers. This designates the field
        # indexes (1-based) of the fields that have indexes on the table.
        # Here, we skip any indexes across multiple fields.
        if ' ' in row[0]:
        if ' ' in row[1]:
            continue
        col_name = desc[int(row[0])-1][0]
        indexes[col_name] = {'primary_key': row[2], 'unique': row[1]}
        indexes[row[0]] = {'primary_key': row[3], 'unique': row[2]}
    return indexes

# Maps type codes to Django Field types.