diff options
author | Justin Bronn <jbronn@gmail.com> | 2009-12-19 08:19:38 +0000 |
---|---|---|
committer | Justin Bronn <jbronn@gmail.com> | 2009-12-19 08:19:38 +0000 |
commit | f1ea26dd99415d376ab0e170bfce75fcfdeb7c01 (patch) | |
tree | 40d7cd808c7ffd20b3d037a548c96a2749559c63 /django/db/backends/postgresql/creation.py | |
parent | ca2d64788d74ea86d4e462d3e58311dc651ee5e0 (diff) | |
download | django-f1ea26dd99415d376ab0e170bfce75fcfdeb7c01.tar.gz |
Fixed #12234 -- Create additional indexes that use the appropriate operation class for PostgreSQL `varchar` and `text` columns when `db_index=True`.
git-svn-id: http://code.djangoproject.com/svn/django/trunk@11912 bcc190cf-cafb-0310-a4f2-bffc1f526a37
Diffstat (limited to 'django/db/backends/postgresql/creation.py')
-rw-r--r-- | django/db/backends/postgresql/creation.py | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/django/db/backends/postgresql/creation.py b/django/db/backends/postgresql/creation.py index 0940c7eb71..be7f49482b 100644 --- a/django/db/backends/postgresql/creation.py +++ b/django/db/backends/postgresql/creation.py @@ -35,3 +35,42 @@ class DatabaseCreation(BaseDatabaseCreation): if settings.TEST_DATABASE_CHARSET: return "WITH ENCODING '%s'" % settings.TEST_DATABASE_CHARSET return '' + + def sql_indexes_for_field(self, model, f, style): + if f.db_index and not f.unique: + qn = self.connection.ops.quote_name + db_table = model._meta.db_table + tablespace = f.db_tablespace or model._meta.db_tablespace + if tablespace: + sql = self.connection.ops.tablespace_sql(tablespace) + if sql: + tablespace_sql = ' ' + sql + else: + tablespace_sql = '' + else: + tablespace_sql = '' + + def get_index_sql(index_name, opclass=''): + return (style.SQL_KEYWORD('CREATE INDEX') + ' ' + + style.SQL_TABLE(qn(index_name)) + ' ' + + style.SQL_KEYWORD('ON') + ' ' + + style.SQL_TABLE(qn(db_table)) + ' ' + + "(%s%s)" % (style.SQL_FIELD(qn(f.column)), opclass) + + "%s;" % tablespace_sql) + + output = [get_index_sql('%s_%s' % (db_table, f.column))] + + # Fields with database column types of `varchar` and `text` need + # a second index that specifies their operator class, which is + # needed when performing correct LIKE queries outside the + # C locale. See #12234. + db_type = f.db_type() + if db_type.startswith('varchar'): + output.append(get_index_sql('%s_%s_like' % (db_table, f.column), + ' varchar_pattern_ops')) + elif db_type.startswith('text'): + output.append(get_index_sql('%s_%s_like' % (db_table, f.column), + ' text_pattern_ops')) + else: + output = [] + return output |