Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

Fixed #11487: pass long strings to Oracle as CLOB rather than NCLOB t…

…o prevent an encoding bug that occurs in some installations. Backport of [11285] from trunk.

git-svn-id: http://code.djangoproject.com/svn/django/branches/releases/1.0.X@11286 bcc190cf-cafb-0310-a4f2-bffc1f526a37
  • Loading branch information...
commit 77b269e875661d72ba7fc0926a5bb8d3d6d8b09d 1 parent 72e2713
@ikelly ikelly authored
View
6 django/db/backends/oracle/base.py
@@ -319,7 +319,7 @@ class OracleParam(object):
"""
Wrapper object for formatting parameters for Oracle. If the string
representation of the value is large enough (greater than 4000 characters)
- the input size needs to be set as NCLOB. Alternatively, if the parameter
+ the input size needs to be set as CLOB. Alternatively, if the parameter
has an `input_size` attribute, then the value of the `input_size` attribute
will be used instead. Otherwise, no input size will be set for the
parameter when executing the query.
@@ -331,8 +331,8 @@ def __init__(self, param, charset, strings_only=False):
# If parameter has `input_size` attribute, use that.
self.input_size = param.input_size
elif isinstance(param, basestring) and len(param) > 4000:
- # Mark any string param greater than 4000 characters as an NCLOB.
- self.input_size = Database.NCLOB
+ # Mark any string param greater than 4000 characters as a CLOB.
+ self.input_size = Database.CLOB
else:
self.input_size = None
View
14 tests/regressiontests/backends/tests.py
@@ -20,7 +20,21 @@ def test_dbms_session(self):
return True
else:
return True
+
+class LongString(unittest.TestCase):
+ def test_long_string(self):
+ # If the backend is Oracle, test that we can save a text longer
+ # than 4000 chars and read it properly
+ if settings.DATABASE_ENGINE == 'oracle':
+ c = connection.cursor()
+ c.execute('CREATE TABLE ltext ("TEXT" NCLOB)')
+ long_str = ''.join([unicode(x) for x in xrange(4000)])
+ c.execute('INSERT INTO ltext VALUES (%s)',[long_str])
+ c.execute('SELECT text FROM ltext')
+ row = c.fetchone()
+ c.execute('DROP TABLE ltext')
+ self.assertEquals(long_str, row[0].read())
if __name__ == '__main__':
unittest.main()
Please sign in to comment.
Something went wrong with that request. Please try again.