web/lib/django/db/backends/postgresql/operations.py
author ymh <ymh.work@gmail.com>
Wed, 02 Jun 2010 18:57:35 +0200
changeset 38 77b6da96e6f1
permissions -rw-r--r--
update django
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
38
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
     1
import re
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
     2
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
     3
from django.db.backends import BaseDatabaseOperations
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
     4
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
     5
# This DatabaseOperations class lives in here instead of base.py because it's
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
     6
# used by both the 'postgresql' and 'postgresql_psycopg2' backends.
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
     7
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
     8
class DatabaseOperations(BaseDatabaseOperations):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
     9
    def __init__(self, connection):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    10
        super(DatabaseOperations, self).__init__()
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    11
        self._postgres_version = None
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    12
        self.connection = connection
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    13
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    14
    def _get_postgres_version(self):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    15
        if self._postgres_version is None:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    16
            from django.db.backends.postgresql.version import get_version
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    17
            cursor = self.connection.cursor()
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    18
            self._postgres_version = get_version(cursor)
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    19
        return self._postgres_version
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    20
    postgres_version = property(_get_postgres_version)
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    21
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    22
    def date_extract_sql(self, lookup_type, field_name):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    23
        # http://www.postgresql.org/docs/8.0/static/functions-datetime.html#FUNCTIONS-DATETIME-EXTRACT
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    24
        if lookup_type == 'week_day':
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    25
            # For consistency across backends, we return Sunday=1, Saturday=7.
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    26
            return "EXTRACT('dow' FROM %s) + 1" % field_name
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    27
        else:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    28
            return "EXTRACT('%s' FROM %s)" % (lookup_type, field_name)
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    29
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    30
    def date_trunc_sql(self, lookup_type, field_name):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    31
        # http://www.postgresql.org/docs/8.0/static/functions-datetime.html#FUNCTIONS-DATETIME-TRUNC
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    32
        return "DATE_TRUNC('%s', %s)" % (lookup_type, field_name)
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    33
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    34
    def deferrable_sql(self):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    35
        return " DEFERRABLE INITIALLY DEFERRED"
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    36
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    37
    def lookup_cast(self, lookup_type):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    38
        lookup = '%s'
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    39
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    40
        # Cast text lookups to text to allow things like filter(x__contains=4)
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    41
        if lookup_type in ('iexact', 'contains', 'icontains', 'startswith',
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    42
                           'istartswith', 'endswith', 'iendswith'):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    43
            lookup = "%s::text"
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    44
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    45
        # Use UPPER(x) for case-insensitive lookups; it's faster.
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    46
        if lookup_type in ('iexact', 'icontains', 'istartswith', 'iendswith'):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    47
            lookup = 'UPPER(%s)' % lookup
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    48
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    49
        return lookup
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    50
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    51
    def field_cast_sql(self, db_type):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    52
        if db_type == 'inet':
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    53
            return 'HOST(%s)'
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    54
        return '%s'
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    55
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    56
    def last_insert_id(self, cursor, table_name, pk_name):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    57
        cursor.execute("SELECT CURRVAL('\"%s_%s_seq\"')" % (table_name, pk_name))
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    58
        return cursor.fetchone()[0]
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    59
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    60
    def no_limit_value(self):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    61
        return None
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    62
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    63
    def quote_name(self, name):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    64
        if name.startswith('"') and name.endswith('"'):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    65
            return name # Quoting once is enough.
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    66
        return '"%s"' % name
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    67
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    68
    def sql_flush(self, style, tables, sequences):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    69
        if tables:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    70
            if self.postgres_version[0:2] >= (8,1):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    71
                # Postgres 8.1+ can do 'TRUNCATE x, y, z...;'. In fact, it *has to*
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    72
                # in order to be able to truncate tables referenced by a foreign
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    73
                # key in any other table. The result is a single SQL TRUNCATE
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    74
                # statement.
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    75
                sql = ['%s %s;' % \
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    76
                    (style.SQL_KEYWORD('TRUNCATE'),
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    77
                     style.SQL_FIELD(', '.join([self.quote_name(table) for table in tables]))
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    78
                )]
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    79
            else:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    80
                # Older versions of Postgres can't do TRUNCATE in a single call, so
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    81
                # they must use a simple delete.
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    82
                sql = ['%s %s %s;' % \
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    83
                        (style.SQL_KEYWORD('DELETE'),
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    84
                         style.SQL_KEYWORD('FROM'),
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    85
                         style.SQL_FIELD(self.quote_name(table))
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    86
                         ) for table in tables]
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    87
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    88
            # 'ALTER SEQUENCE sequence_name RESTART WITH 1;'... style SQL statements
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    89
            # to reset sequence indices
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    90
            for sequence_info in sequences:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    91
                table_name = sequence_info['table']
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    92
                column_name = sequence_info['column']
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    93
                if column_name and len(column_name) > 0:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    94
                    sequence_name = '%s_%s_seq' % (table_name, column_name)
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    95
                else:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    96
                    sequence_name = '%s_id_seq' % table_name
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    97
                sql.append("%s setval('%s', 1, false);" % \
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    98
                    (style.SQL_KEYWORD('SELECT'),
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    99
                    style.SQL_FIELD(self.quote_name(sequence_name)))
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   100
                )
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   101
            return sql
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   102
        else:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   103
            return []
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   104
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   105
    def sequence_reset_sql(self, style, model_list):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   106
        from django.db import models
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   107
        output = []
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   108
        qn = self.quote_name
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   109
        for model in model_list:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   110
            # Use `coalesce` to set the sequence for each model to the max pk value if there are records,
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   111
            # or 1 if there are none. Set the `is_called` property (the third argument to `setval`) to true
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   112
            # if there are records (as the max pk value is already in use), otherwise set it to false.
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   113
            for f in model._meta.local_fields:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   114
                if isinstance(f, models.AutoField):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   115
                    output.append("%s setval('%s', coalesce(max(%s), 1), max(%s) %s null) %s %s;" % \
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   116
                        (style.SQL_KEYWORD('SELECT'),
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   117
                        style.SQL_FIELD(qn('%s_%s_seq' % (model._meta.db_table, f.column))),
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   118
                        style.SQL_FIELD(qn(f.column)),
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   119
                        style.SQL_FIELD(qn(f.column)),
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   120
                        style.SQL_KEYWORD('IS NOT'),
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   121
                        style.SQL_KEYWORD('FROM'),
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   122
                        style.SQL_TABLE(qn(model._meta.db_table))))
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   123
                    break # Only one AutoField is allowed per model, so don't bother continuing.
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   124
            for f in model._meta.many_to_many:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   125
                if not f.rel.through:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   126
                    output.append("%s setval('%s', coalesce(max(%s), 1), max(%s) %s null) %s %s;" % \
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   127
                        (style.SQL_KEYWORD('SELECT'),
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   128
                        style.SQL_FIELD(qn('%s_id_seq' % f.m2m_db_table())),
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   129
                        style.SQL_FIELD(qn('id')),
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   130
                        style.SQL_FIELD(qn('id')),
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   131
                        style.SQL_KEYWORD('IS NOT'),
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   132
                        style.SQL_KEYWORD('FROM'),
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   133
                        style.SQL_TABLE(qn(f.m2m_db_table()))))
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   134
        return output
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   135
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   136
    def savepoint_create_sql(self, sid):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   137
        return "SAVEPOINT %s" % sid
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   138
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   139
    def savepoint_commit_sql(self, sid):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   140
        return "RELEASE SAVEPOINT %s" % sid
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   141
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   142
    def savepoint_rollback_sql(self, sid):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   143
        return "ROLLBACK TO SAVEPOINT %s" % sid
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   144
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   145
    def prep_for_iexact_query(self, x):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   146
        return x
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   147
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   148
    def check_aggregate_support(self, aggregate):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   149
        """Check that the backend fully supports the provided aggregate.
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   150
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   151
        The population and sample statistics (STDDEV_POP, STDDEV_SAMP,
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   152
        VAR_POP, VAR_SAMP) were first implemented in Postgres 8.2.
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   153
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   154
        The implementation of population statistics (STDDEV_POP and VAR_POP)
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   155
        under Postgres 8.2 - 8.2.4 is known to be faulty. Raise
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   156
        NotImplementedError if this is the database in use.
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   157
        """
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   158
        if aggregate.sql_function in ('STDDEV_POP', 'STDDEV_SAMP', 'VAR_POP', 'VAR_SAMP'):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   159
            if self.postgres_version[0:2] < (8,2):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   160
                raise NotImplementedError('PostgreSQL does not support %s prior to version 8.2. Please upgrade your version of PostgreSQL.' % aggregate.sql_function)
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   161
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   162
        if aggregate.sql_function in ('STDDEV_POP', 'VAR_POP'):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   163
            if self.postgres_version[0:2] == (8,2):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   164
                if self.postgres_version[2] is None or self.postgres_version[2] <= 4:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   165
                    raise NotImplementedError('PostgreSQL 8.2 to 8.2.4 is known to have a faulty implementation of %s. Please upgrade your version of PostgreSQL.' % aggregate.sql_function)
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   166
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   167
    def max_name_length(self):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   168
        """
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   169
        Returns the maximum length of an identifier.
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   170
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   171
        Note that the maximum length of an identifier is 63 by default, but can
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   172
        be changed by recompiling PostgreSQL after editing the NAMEDATALEN
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   173
        macro in src/include/pg_config_manual.h .
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   174
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   175
        This implementation simply returns 63, but can easily be overridden by a
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   176
        custom database backend that inherits most of its behavior from this one.
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   177
        """
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   178
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   179
        return 63