Opened 5 years ago
Closed 5 years ago
#32073 closed Bug (fixed)
Test suite failing under PostgresSQL < 10 due to missing support for ICU collations
| Reported by: | Hannes Ljungberg | Owned by: | Mariusz Felisiak |
|---|---|---|---|
| Component: | Database layer (models, ORM) | Version: | dev |
| Severity: | Normal | Keywords: | |
| Cc: | Triage Stage: | Accepted | |
| Has patch: | yes | Needs documentation: | no |
| Needs tests: | no | Patch needs improvement: | no |
| Easy pickings: | no | UI/UX: | no |
Description
When running the test suite on PostgresSQL versions below 10 it fails with the following error message when creating the test database:
Creating test database for alias 'default'...
Traceback (most recent call last):
File "/tests/django/django/db/backends/utils.py", line 82, in _execute
return self.cursor.execute(sql)
psycopg2.errors.UndefinedObject: collation "sv-x-icu" for encoding "UTF8" does not exist
LINE 1: ...al NOT NULL PRIMARY KEY, "char_field" varchar(10) COLLATE "s...
^
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "tests/runtests.py", line 589, in <module>
options.timing,
File "tests/runtests.py", line 320, in django_tests
extra_tests=extra_tests,
File "/tests/django/django/test/runner.py", line 717, in run_tests
old_config = self.setup_databases(aliases=databases)
File "/tests/django/django/test/runner.py", line 637, in setup_databases
debug_sql=self.debug_sql, parallel=self.parallel, **kwargs
File "/tests/django/django/test/utils.py", line 183, in setup_databases
serialize=connection.settings_dict['TEST'].get('SERIALIZE', True),
File "/tests/django/django/db/backends/base/creation.py", line 77, in create_test_db
run_syncdb=True,
File "/tests/django/django/core/management/__init__.py", line 172, in call_command
return command.execute(*args, **defaults)
File "/tests/django/django/core/management/base.py", line 394, in execute
output = self.handle(*args, **options)
File "/tests/django/django/core/management/base.py", line 89, in wrapped
res = handle_func(*args, **kwargs)
File "/tests/django/django/core/management/commands/migrate.py", line 214, in handle
self.sync_apps(connection, executor.loader.unmigrated_apps)
File "/tests/django/django/core/management/commands/migrate.py", line 349, in sync_apps
editor.create_model(model)
File "/tests/django/django/db/backends/base/schema.py", line 329, in create_model
self.execute(sql, params or None)
File "/tests/django/django/db/backends/base/schema.py", line 143, in execute
cursor.execute(sql, params)
File "/tests/django/django/db/backends/utils.py", line 66, in execute
return self._execute_with_wrappers(sql, params, many=False, executor=self._execute)
File "/tests/django/django/db/backends/utils.py", line 75, in _execute_with_wrappers
return executor(sql, params, many, context)
File "/tests/django/django/db/backends/utils.py", line 84, in _execute
return self.cursor.execute(sql, params)
File "/tests/django/django/db/utils.py", line 90, in __exit__
raise dj_exc_value.with_traceback(traceback) from exc_value
File "/tests/django/django/db/backends/utils.py", line 82, in _execute
return self.cursor.execute(sql)
django.db.utils.ProgrammingError: collation "sv-x-icu" for encoding "UTF8" does not exist
LINE 1: ...al NOT NULL PRIMARY KEY, "char_field" varchar(10) COLLATE "s...
It feels like something that could've been introduced by https://github.com/django/django/pull/13207 and more specifically https://github.com/django/django/pull/13207/files#diff-9385ef62a9e10556c6768c66e8f6e2ebR62. Awesome stuff BTW!
Support for ICU collations was introduced in PostgreSQL 10 https://wiki.postgresql.org/wiki/New_in_postgres_10#ICU_Collation_Support
Not really sure how to approach this. I see three different solutions:
- Use non ICU collations for PostgreSQL but I'm pretty sure that it won't be possible to test case-insensitive collations in that case.
- Fallback to non ICU collations on versions below 10 and skip tests that explicitly test features provided by ICU collations
- Limit usage of collations on fields to version 10 and above with
supports_collation_on_*.
I created an issue on the django/django-docker-box repo before I came to the conclusion that it wasn't an configuration error: https://github.com/django/django-docker-box/issues/21
Change History (3)
comment:1 by , 5 years ago
| Owner: | changed from to |
|---|---|
| Status: | new → assigned |
| Triage Stage: | Unreviewed → Accepted |
Thanks for the report.
We cannot control which locales are installed locally, so non ICU collations are not an option. I think we can skip these tests on PostgreSQL < 10.