Loading django/contrib/gis/tests/utils.py +1 −1 Original line number Diff line number Diff line Loading @@ -26,7 +26,7 @@ mysql = _default_db == 'mysql' spatialite = _default_db == 'spatialite' HAS_SPATIALREFSYS = True if oracle: if oracle and 'gis' in settings.DATABASES[DEFAULT_DB_ALIAS]['ENGINE']: from django.contrib.gis.db.backends.oracle.models import SpatialRefSys elif postgis: from django.contrib.gis.db.backends.postgis.models import SpatialRefSys Loading django/db/backends/oracle/base.py +4 −0 Original line number Diff line number Diff line Loading @@ -256,6 +256,10 @@ WHEN (new.%(col_name)s IS NULL) if not name.startswith('"') and not name.endswith('"'): name = '"%s"' % util.truncate_name(name.upper(), self.max_name_length()) # Oracle puts the query text into a (query % args) construct, so % signs # in names need to be escaped. The '%%' will be collapsed back to '%' at # that stage so we aren't really making the name longer here. name = name.replace('%','%%') return name.upper() def random_function_sql(self): Loading django/db/models/query.py +9 −2 Original line number Diff line number Diff line Loading @@ -1418,8 +1418,15 @@ def get_cached_row(row, index_start, using, klass_info, offset=0): fields = row[index_start : index_start + field_count] # If all the select_related columns are None, then the related # object must be non-existent - set the relation to None. # Otherwise, construct the related object. if fields == (None,) * field_count: # Otherwise, construct the related object. Also, some backends treat '' # and None equivalently for char fields, so we have to be prepared for # '' values. if connections[using].features.interprets_empty_strings_as_nulls: vals = tuple([None if f == '' else f for f in fields]) else: vals = fields if vals == (None,) * field_count: obj = None else: if field_names: Loading tests/regressiontests/backends/tests.py +8 −0 Original line number Diff line number Diff line Loading @@ -25,6 +25,14 @@ from . import models class OracleChecks(unittest.TestCase): @unittest.skipUnless(connection.vendor == 'oracle', "No need to check Oracle quote_name semantics") def test_quote_name(self): # Check that '%' chars are escaped for query execution. name = '"SOME%NAME"' quoted_name = connection.ops.quote_name(name) self.assertEquals(quoted_name % (), name) @unittest.skipUnless(connection.vendor == 'oracle', "No need to check Oracle cursor semantics") def test_dbms_session(self): Loading tests/regressiontests/inspectdb/tests.py +7 −4 Original line number Diff line number Diff line from __future__ import unicode_literals from django.core.management import call_command from django.db import connection from django.test import TestCase, skipUnlessDBFeature from django.utils.six import StringIO Loading Loading @@ -60,14 +61,16 @@ class InspectDBTestCase(TestCase): self.assertIn("number_45extra = models.CharField", output) def test_special_column_name_introspection(self): """Introspection of column names containing special characters, """ Introspection of column names containing special characters, unsuitable for Python identifiers """ out = StringIO() call_command('inspectdb', stdout=out) output = out.getvalue() base_name = 'Field' if connection.vendor != 'oracle' else 'field' self.assertIn("field = models.IntegerField()", output) self.assertIn("field_field = models.IntegerField(db_column='Field_')", output) self.assertIn("field_field_0 = models.IntegerField(db_column='Field__')", output) self.assertIn("field_field = models.IntegerField(db_column='%s_')" % base_name, output) self.assertIn("field_field_0 = models.IntegerField(db_column='%s__')" % base_name, output) self.assertIn("field_field_1 = models.IntegerField(db_column='__field')", output) self.assertIn("prc_x = models.IntegerField(db_column='prc(%) x')", output) Loading
django/contrib/gis/tests/utils.py +1 −1 Original line number Diff line number Diff line Loading @@ -26,7 +26,7 @@ mysql = _default_db == 'mysql' spatialite = _default_db == 'spatialite' HAS_SPATIALREFSYS = True if oracle: if oracle and 'gis' in settings.DATABASES[DEFAULT_DB_ALIAS]['ENGINE']: from django.contrib.gis.db.backends.oracle.models import SpatialRefSys elif postgis: from django.contrib.gis.db.backends.postgis.models import SpatialRefSys Loading
django/db/backends/oracle/base.py +4 −0 Original line number Diff line number Diff line Loading @@ -256,6 +256,10 @@ WHEN (new.%(col_name)s IS NULL) if not name.startswith('"') and not name.endswith('"'): name = '"%s"' % util.truncate_name(name.upper(), self.max_name_length()) # Oracle puts the query text into a (query % args) construct, so % signs # in names need to be escaped. The '%%' will be collapsed back to '%' at # that stage so we aren't really making the name longer here. name = name.replace('%','%%') return name.upper() def random_function_sql(self): Loading
django/db/models/query.py +9 −2 Original line number Diff line number Diff line Loading @@ -1418,8 +1418,15 @@ def get_cached_row(row, index_start, using, klass_info, offset=0): fields = row[index_start : index_start + field_count] # If all the select_related columns are None, then the related # object must be non-existent - set the relation to None. # Otherwise, construct the related object. if fields == (None,) * field_count: # Otherwise, construct the related object. Also, some backends treat '' # and None equivalently for char fields, so we have to be prepared for # '' values. if connections[using].features.interprets_empty_strings_as_nulls: vals = tuple([None if f == '' else f for f in fields]) else: vals = fields if vals == (None,) * field_count: obj = None else: if field_names: Loading
tests/regressiontests/backends/tests.py +8 −0 Original line number Diff line number Diff line Loading @@ -25,6 +25,14 @@ from . import models class OracleChecks(unittest.TestCase): @unittest.skipUnless(connection.vendor == 'oracle', "No need to check Oracle quote_name semantics") def test_quote_name(self): # Check that '%' chars are escaped for query execution. name = '"SOME%NAME"' quoted_name = connection.ops.quote_name(name) self.assertEquals(quoted_name % (), name) @unittest.skipUnless(connection.vendor == 'oracle', "No need to check Oracle cursor semantics") def test_dbms_session(self): Loading
tests/regressiontests/inspectdb/tests.py +7 −4 Original line number Diff line number Diff line from __future__ import unicode_literals from django.core.management import call_command from django.db import connection from django.test import TestCase, skipUnlessDBFeature from django.utils.six import StringIO Loading Loading @@ -60,14 +61,16 @@ class InspectDBTestCase(TestCase): self.assertIn("number_45extra = models.CharField", output) def test_special_column_name_introspection(self): """Introspection of column names containing special characters, """ Introspection of column names containing special characters, unsuitable for Python identifiers """ out = StringIO() call_command('inspectdb', stdout=out) output = out.getvalue() base_name = 'Field' if connection.vendor != 'oracle' else 'field' self.assertIn("field = models.IntegerField()", output) self.assertIn("field_field = models.IntegerField(db_column='Field_')", output) self.assertIn("field_field_0 = models.IntegerField(db_column='Field__')", output) self.assertIn("field_field = models.IntegerField(db_column='%s_')" % base_name, output) self.assertIn("field_field_0 = models.IntegerField(db_column='%s__')" % base_name, output) self.assertIn("field_field_1 = models.IntegerField(db_column='__field')", output) self.assertIn("prc_x = models.IntegerField(db_column='prc(%) x')", output)