From 0d21bdd3805f5d3a37a02062a170cabe377aa8fe Mon Sep 17 00:00:00 2001
From: Mariusz Felisiak <felisiak.mariusz@gmail.com>
Date: Wed, 23 Aug 2017 10:01:49 +0200
Subject: [PATCH] [1.11.x] Fixed #28498 -- Added support for cx_Oracle 6.

- Fixed implicit Decimal to float conversion when input_size is not
specified for Decimal parameters.
- Used encoding, nencoding parameters of cx_Oracle.connect() to support
unicode in DSN.

Thanks Tim Graham for the review.
---
 django/db/backends/oracle/base.py | 11 ++++++++---
 docs/releases/1.11.5.txt          |  2 +-
 tests/backends/tests.py           |  8 ++++++++
 3 files changed, 17 insertions(+), 4 deletions(-)

diff --git a/django/db/backends/oracle/base.py b/django/db/backends/oracle/base.py
index 65b5e10909..2de74da5f8 100644
--- a/django/db/backends/oracle/base.py
+++ b/django/db/backends/oracle/base.py
@@ -200,9 +200,12 @@ class DatabaseWrapper(BaseDatabaseWrapper):
                              settings_dict['PASSWORD'], dsn)
 
     def get_connection_params(self):
-        conn_params = self.settings_dict['OPTIONS'].copy()
-        if 'use_returning_into' in conn_params:
-            del conn_params['use_returning_into']
+        # Specify encoding to support unicode in DSN.
+        conn_params = {'encoding': 'UTF-8', 'nencoding': 'UTF-8'}
+        user_params = self.settings_dict['OPTIONS'].copy()
+        if 'use_returning_into' in user_params:
+            del user_params['use_returning_into']
+        conn_params.update(user_params)
         return conn_params
 
     def get_new_connection(self, conn_params):
@@ -359,6 +362,8 @@ class OracleParam(object):
         elif string_size > 4000:
             # Mark any string param greater than 4000 characters as a CLOB.
             self.input_size = Database.CLOB
+        elif isinstance(param, decimal.Decimal):
+            self.input_size = Database.NUMBER
         else:
             self.input_size = None
 
diff --git a/docs/releases/1.11.5.txt b/docs/releases/1.11.5.txt
index 78279d5aa3..f650fe4b5a 100644
--- a/docs/releases/1.11.5.txt
+++ b/docs/releases/1.11.5.txt
@@ -12,7 +12,7 @@ Bugfixes
 * Fixed GEOS version parsing if the version has a commit hash at the end (new
   in GEOS 3.6.2) (:ticket:`28441`).
 
-* Fixed test database creation with ``cx_Oracle`` 6 (:ticket:`28498`).
+* Added compatibility for ``cx_Oracle`` 6 (:ticket:`28498`).
 
 * Fixed select widget rendering when option values are tuples (:ticket:`28502`).
 
diff --git a/tests/backends/tests.py b/tests/backends/tests.py
index 83d6b05b5e..16a20de40d 100644
--- a/tests/backends/tests.py
+++ b/tests/backends/tests.py
@@ -117,6 +117,14 @@ class OracleTests(unittest.TestCase):
         connection.ensure_connection()
         self.assertEqual(connection.connection.encoding, "UTF-8")
         self.assertEqual(connection.connection.nencoding, "UTF-8")
+        # Client encoding may be changed in OPTIONS.
+        new_connection = connection.copy()
+        new_connection.settings_dict['OPTIONS']['encoding'] = 'ISO-8859-2'
+        new_connection.settings_dict['OPTIONS']['nencoding'] = 'ASCII'
+        new_connection.ensure_connection()
+        self.assertEqual(new_connection.connection.encoding, 'ISO-8859-2')
+        self.assertEqual(new_connection.connection.nencoding, 'ASCII')
+        new_connection.close()
 
     def test_order_of_nls_parameters(self):
         # an 'almost right' datetime should work with configured