From 32f50999cd4ccf4e5667f20df3d89421c599a9af Mon Sep 17 00:00:00 2001
From: Mariusz Felisiak <felisiak.mariusz@gmail.com>
Date: Wed, 2 Nov 2016 14:44:15 +0100
Subject: [PATCH] [1.8.x] Fixed #27420 -- Quoted the Oracle test user password
 in queries.

Backport of c4b04e1598c4325454c808183dce17b284ed9e28 from master
---
 django/db/backends/oracle/creation.py |  4 ++--
 docs/ref/databases.txt                |  1 +
 docs/releases/1.8.17.txt              | 14 ++++++++++++++
 docs/releases/index.txt               |  1 +
 4 files changed, 18 insertions(+), 2 deletions(-)
 create mode 100644 docs/releases/1.8.17.txt

diff --git a/django/db/backends/oracle/creation.py b/django/db/backends/oracle/creation.py
index 28475a6e55..255a77075e 100644
--- a/django/db/backends/oracle/creation.py
+++ b/django/db/backends/oracle/creation.py
@@ -174,7 +174,7 @@ class DatabaseCreation(BaseDatabaseCreation):
             print("_create_test_user(): username = %s" % parameters['user'])
         statements = [
             """CREATE USER %(user)s
-               IDENTIFIED BY %(password)s
+               IDENTIFIED BY "%(password)s"
                DEFAULT TABLESPACE %(tblspace)s
                TEMPORARY TABLESPACE %(tblspace_temp)s
                QUOTA UNLIMITED ON %(tblspace)s
@@ -191,7 +191,7 @@ class DatabaseCreation(BaseDatabaseCreation):
         success = self._execute_allow_fail_statements(cursor, statements, parameters, verbosity, acceptable_ora_err)
         # If the password was randomly generated, change the user accordingly.
         if not success and self._test_settings_get('PASSWORD') is None:
-            set_password = "ALTER USER %(user)s IDENTIFIED BY %(password)s"
+            set_password = 'ALTER USER %(user)s IDENTIFIED BY "%(password)s"'
             self._execute_statements(cursor, [set_password], parameters, verbosity)
         # Most test-suites can be run without the create-view privilege. But some need it.
         extra = "GRANT CREATE VIEW TO %(user)s"
diff --git a/docs/ref/databases.txt b/docs/ref/databases.txt
index ed15390e45..29ac9dd1c0 100644
--- a/docs/ref/databases.txt
+++ b/docs/ref/databases.txt
@@ -729,6 +729,7 @@ To run a project's test suite, the user usually needs these *additional*
 privileges:
 
 * CREATE USER
+* ALTER USER
 * DROP USER
 * CREATE TABLESPACE
 * DROP TABLESPACE
diff --git a/docs/releases/1.8.17.txt b/docs/releases/1.8.17.txt
new file mode 100644
index 0000000000..2464d155da
--- /dev/null
+++ b/docs/releases/1.8.17.txt
@@ -0,0 +1,14 @@
+===========================
+Django 1.8.17 release notes
+===========================
+
+*Under development*
+
+Django 1.8.17 fixes a regression in 1.8.16.
+
+Bugfixes
+========
+
+* Quoted the Oracle test user's password in queries to fix the "ORA-00922:
+  missing or invalid option" error when the password starts with a number or
+  special character (:ticket:`27420`).
diff --git a/docs/releases/index.txt b/docs/releases/index.txt
index 134da0fc2c..997ac0b1d7 100644
--- a/docs/releases/index.txt
+++ b/docs/releases/index.txt
@@ -25,6 +25,7 @@ versions of the documentation contain the release notes for any later releases.
 .. toctree::
    :maxdepth: 1
 
+   1.8.17
    1.8.16
    1.8.15
    1.8.14