id summary reporter owner description type status component version severity resolution keywords cc stage has_patch needs_docs needs_tests needs_better_patch easy ui_ux 27478 JSONB_AGG is not available in PostgreSQL 9.4 Christian von Roques nobody "`django.contrib.postgres.aggregates.general.JsonAgg` uses `JSONB_AGG`. The Django test-suite contains a test which fails due to `JSONB_AGG` being unavailable as shown below when run against PostgreSQL 9.4. The test is already marked as `@skipUnlessDBFeature('has_jsonb_datatype')`, but JSONB became available with PostgreSQL 9.4 and `JSONB_AGG` was added in PostgreSQL 9.5. I currently see three possibilities: 1. Add a new feature `has_jsonb_agg` and make the test `@skipUnlessDBFeature('has_jsonb_agg')` 2. Add a new feature `has_jsonb_agg` and use `JSON_AGG` instead of `JSONB_AGG` when `JSONB_AGG` is unavailable. 3. Have `has_jsonb_datatype` lie about it not being available in PostgreSQL 9.4. I prefer and have implemented option 2 and really don't like option 3. See my [https://github.com/roques/django/tree/jsonb_agg branch] for my initial implementation. — Is there a cleaner way to achieve this besides redefining `JsonAgg.as_sql`? {{{ ERROR: test_json_agg (postgres_tests.test_aggregates.TestGeneralAggregate) ---------------------------------------------------------------------- Traceback (most recent call last): File ""/usr/lib/python3.4/unittest/case.py"", line 58, in testPartExecutor yield File ""/usr/lib/python3.4/unittest/case.py"", line 577, in run testMethod() File ""/home/roques/tools/django/django/test/testcases.py"", line 1113, in skip_wrapper return test_func(*args, **kwargs) File ""/home/roques/tools/django/tests/postgres_tests/test_aggregates.py"", line 122, in test_json_agg values = AggregateTestModel.objects.aggregate(jsonagg=JsonAgg('char_field')) File ""/home/roques/tools/django/django/db/models/manager.py"", line 85, in manager_method return getattr(self.get_queryset(), name)(*args, **kwargs) File ""/home/roques/tools/django/django/db/models/query.py"", line 352, in aggregate return query.get_aggregation(self.db, kwargs.keys()) File ""/home/roques/tools/django/django/db/models/sql/query.py"", line 461, in get_aggregation result = compiler.execute_sql(SINGLE) File ""/home/roques/tools/django/django/db/models/sql/compiler.py"", line 829, in execute_sql cursor.execute(sql, params) File ""/home/roques/tools/django/django/db/backends/utils.py"", line 64, in execute return self.cursor.execute(sql, params) File ""/home/roques/tools/django/django/db/utils.py"", line 94, in __exit__ six.reraise(dj_exc_type, dj_exc_value, traceback) File ""/home/roques/tools/django/django/utils/six.py"", line 685, in reraise raise value.with_traceback(tb) File ""/home/roques/tools/django/django/db/backends/utils.py"", line 64, in execute return self.cursor.execute(sql, params) django.db.utils.ProgrammingError: function jsonb_agg(character varying) does not exist LINE 1: SELECT JSONB_AGG(""postgres_tests_aggregatetestmodel"".""char_f... ^ HINT: No function matches the given name and argument types. You might need to add explicit type casts. }}}" Cleanup/optimization closed contrib.postgres dev Normal duplicate JsonAgg JSONB_AGG Christian von Roques Unreviewed 1 0 0 0 0 0