summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorMariusz Felisiak <felisiak.mariusz@gmail.com>2023-06-27 13:50:42 +0200
committerGitHub <noreply@github.com>2023-06-27 13:50:42 +0200
commita6d30f50125782db6643d4b24ff30d88adf13cbe (patch)
tree1c5dc3b1c1de91c5e03c14459cf8bd91bcc61611 /tests
parentc4a09499aa760c92969083b4639703b5b0a562fb (diff)
Fixed #34671 -- Fixed collation introspection for views and materialized views on Oracle.
Thanks Philipp Maino for the report.
Diffstat (limited to 'tests')
-rw-r--r--tests/backends/oracle/test_introspection.py55
1 files changed, 53 insertions, 2 deletions
diff --git a/tests/backends/oracle/test_introspection.py b/tests/backends/oracle/test_introspection.py
index c6a143eb2d..beeb4f603e 100644
--- a/tests/backends/oracle/test_introspection.py
+++ b/tests/backends/oracle/test_introspection.py
@@ -1,9 +1,9 @@
import unittest
from django.db import connection
-from django.test import TransactionTestCase
+from django.test import TransactionTestCase, skipUnlessDBFeature
-from ..models import Square
+from ..models import Person, Square
@unittest.skipUnless(connection.vendor == "oracle", "Oracle tests")
@@ -33,3 +33,54 @@ class DatabaseSequenceTests(TransactionTestCase):
# Recreate model, because adding identity is impossible.
editor.delete_model(Square)
editor.create_model(Square)
+
+ @skipUnlessDBFeature("supports_collation_on_charfield")
+ def test_get_table_description_view_default_collation(self):
+ person_table = connection.introspection.identifier_converter(
+ Person._meta.db_table
+ )
+ first_name_column = connection.ops.quote_name(
+ Person._meta.get_field("first_name").column
+ )
+ person_view = connection.introspection.identifier_converter("TEST_PERSON_VIEW")
+ with connection.cursor() as cursor:
+ cursor.execute(
+ f"CREATE VIEW {person_view} "
+ f"AS SELECT {first_name_column} FROM {person_table}"
+ )
+ try:
+ columns = connection.introspection.get_table_description(
+ cursor, person_view
+ )
+ self.assertEqual(len(columns), 1)
+ self.assertIsNone(columns[0].collation)
+ finally:
+ cursor.execute(f"DROP VIEW {person_view}")
+
+ @skipUnlessDBFeature("supports_collation_on_charfield")
+ def test_get_table_description_materialized_view_non_default_collation(self):
+ person_table = connection.introspection.identifier_converter(
+ Person._meta.db_table
+ )
+ first_name_column = connection.ops.quote_name(
+ Person._meta.get_field("first_name").column
+ )
+ person_mview = connection.introspection.identifier_converter(
+ "TEST_PERSON_MVIEW"
+ )
+ collation = connection.features.test_collations.get("ci")
+ with connection.cursor() as cursor:
+ cursor.execute(
+ f"CREATE MATERIALIZED VIEW {person_mview} "
+ f"DEFAULT COLLATION {collation} "
+ f"AS SELECT {first_name_column} FROM {person_table}"
+ )
+ try:
+ columns = connection.introspection.get_table_description(
+ cursor, person_mview
+ )
+ self.assertEqual(len(columns), 1)
+ self.assertIsNotNone(columns[0].collation)
+ self.assertNotEqual(columns[0].collation, collation)
+ finally:
+ cursor.execute(f"DROP MATERIALIZED VIEW {person_mview}")