From c8a85e3e91bf829671b4a8cbd105fbabce945174 Mon Sep 17 00:00:00 2001 From: Sergey Fedoseev Date: Wed, 20 Dec 2017 21:55:51 +0500 Subject: [PATCH] Fixed #28932 -- Prevented Oracle from truncating trailing zeros in the fractional part of DecimalField. Fixes the test added in 6fd6d8383f48ea2fe4e058725fa30529a083e9a5. Regression in 7c1f3901bcdabb1340a621e7df9b24f3acd0d6f3. --- django/db/backends/oracle/base.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/django/db/backends/oracle/base.py b/django/db/backends/oracle/base.py index 45c3c4e475..488a1b08ab 100644 --- a/django/db/backends/oracle/base.py +++ b/django/db/backends/oracle/base.py @@ -401,6 +401,14 @@ class FormatStylePlaceholderCursor: def _output_number_converter(value): return decimal.Decimal(value) if '.' in value else int(value) + @staticmethod + def _get_decimal_converter(precision, scale): + if scale == 0: + return int + context = decimal.Context(prec=precision) + quantize_value = decimal.Decimal(1).scaleb(-scale) + return lambda v: decimal.Decimal(v).quantize(quantize_value, context=context) + @staticmethod def _output_type_handler(cursor, name, defaultType, length, precision, scale): """ @@ -421,7 +429,7 @@ class FormatStylePlaceholderCursor: elif precision > 0: # NUMBER(p,s) column: decimal-precision fixed point. # This comes from IntegerField and DecimalField columns. - outconverter = int if scale == 0 else decimal.Decimal + outconverter = FormatStylePlaceholderCursor._get_decimal_converter(precision, scale) else: # No type information. This normally comes from a # mathematical expression in the SELECT list. Guess int