[2.2.x] Fixed #30258 -- Adjusted postgres schema value quoting of ranges.

Thanks Tilman Koschnick for the report and patch.

Backport of 386d89ab55 from master
This commit is contained in:
Simon Charette 2019-03-16 13:48:59 -04:00 committed by Mariusz Felisiak
parent 2a92e2e3c1
commit 883d87074d
2 changed files with 37 additions and 1 deletions

View File

@ -22,7 +22,8 @@ class DatabaseSchemaEditor(BaseDatabaseSchemaEditor):
sql_delete_procedure = 'DROP FUNCTION %(procedure)s(%(param_types)s)'
def quote_value(self, value):
return psycopg2.extensions.adapt(value)
# getquoted() returns a quoted byte string of the adapted value.
return psycopg2.extensions.adapt(value).getquoted().decode()
def _field_indexes_sql(self, model, field):
output = super()._field_indexes_sql(model, field)

View File

@ -0,0 +1,35 @@
from django.db import connection, transaction
from django.db.models import Q
from django.db.models.constraints import CheckConstraint
from django.db.utils import IntegrityError
from . import PostgreSQLTestCase
from .models import RangesModel
try:
from psycopg2.extras import NumericRange
except ImportError:
pass
class SchemaTests(PostgreSQLTestCase):
def get_constraints(self, table):
"""Get the constraints on the table using a new cursor."""
with connection.cursor() as cursor:
return connection.introspection.get_constraints(cursor, table)
def test_check_constraint_range_value(self):
constraint_name = 'ints_between'
self.assertNotIn(constraint_name, self.get_constraints(RangesModel._meta.db_table))
constraint = CheckConstraint(
check=Q(ints__contained_by=NumericRange(10, 30)),
name=constraint_name,
)
with connection.schema_editor() as editor:
editor.add_constraint(RangesModel, constraint)
with connection.cursor() as cursor:
constraints = connection.introspection.get_constraints(cursor, RangesModel._meta.db_table)
self.assertIn(constraint_name, constraints)
with self.assertRaises(IntegrityError), transaction.atomic():
RangesModel.objects.create(ints=(20, 50))
RangesModel.objects.create(ints=(10, 30))