Commit 342b2544 authored by Aymeric Augustin's avatar Aymeric Augustin
Browse files

[1.7.x] Added a flag for the ability to introspect nullable fields.

Previously this was conflated with another Oracle-specific behavior.

Backport of a03d38dd from master.
parent 2e4bcb9b
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -663,6 +663,9 @@ class BaseDatabaseFeatures(object):
    # Can the backend determine reliably the length of a CharField?
    can_introspect_max_length = True

    # Can the backend determine reliably if a field is nullable?
    can_introspect_null = True

    # Confirm support for introspected foreign keys
    # Every database can do this reliably, except MySQL,
    # which can't do it for MyISAM tables
+1 −0
Original line number Diff line number Diff line
@@ -112,6 +112,7 @@ class DatabaseFeatures(BaseDatabaseFeatures):
    supports_tablespaces = True
    supports_sequence_reset = False
    can_introspect_max_length = False
    can_introspect_null = False
    can_introspect_time_field = False
    atomic_transactions = False
    supports_combined_alters = False
+4 −5
Original line number Diff line number Diff line
from __future__ import unicode_literals

from django.db import connection
from django.test import TestCase, skipUnlessDBFeature, skipIfDBFeature
from django.test import TestCase, skipUnlessDBFeature

from .models import Reporter, Article

@@ -73,10 +73,9 @@ class IntrospectionTests(TestCase):
            [30, 30, 75]
        )

    # Oracle forces null=True under the hood in some cases (see
    # https://docs.djangoproject.com/en/dev/ref/databases/#null-and-empty-strings)
    # so its idea about null_ok in cursor.description is different from ours.
    @skipIfDBFeature('interprets_empty_strings_as_nulls')
    # The following test fails on Oracle. Since it forces null=True under the
    # hood in some cases, its idea about null_ok is different from ours.
    @skipUnlessDBFeature('can_introspect_null')
    def test_get_table_description_nullable(self):
        with connection.cursor() as cursor:
            desc = connection.introspection.get_table_description(cursor, Reporter._meta.db_table)