From 40b97b37e2188b082cd70eec1cdf14bf9366377e Mon Sep 17 00:00:00 2001 From: Alex Hafner Date: Tue, 21 Jul 2020 13:25:22 +0000 Subject: [FIX] core: use shortened table aliasing in get_join_conditions() Current behavior: Auto-generated SQL fails with ERROR: missing FROM-clause entry for table when table alias names exceed the target length of 63 characters. This is because odoo.osv.expression.py handles shortening the table name alias in generate_table_alias, but not in get_join_conditions. In the resulting SQL, shortened aliases are used in the FROM clause, whereas in the join conditions, the full alias is used, which is both exceeding the Postgres limit and not matching the table name alias in the FROM clause. Expected behavior: auto-generated SQL runs without errors. Implementation of fix: - refactor alias shortening into new function _shorten_alias to make it reusable - Use _shorten_alias in both generate_table_alias and get_join_conditions closes odoo/odoo#57909 X-original-commit: 9570f5ff4694a58035094ad52b4773433dbd018c Signed-off-by: Raphael Collet (rco) --- odoo/osv/query.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) (limited to 'odoo/osv') diff --git a/odoo/osv/query.py b/odoo/osv/query.py index 6edb08b4a65..a6d414d2d29 100644 --- a/odoo/osv/query.py +++ b/odoo/osv/query.py @@ -41,9 +41,7 @@ def _generate_table_alias(src_table_alias, link): if len(alias) >= 64: # We have to fit a crc32 hash and one underscore into a 63 character # alias. The remaining space we can use to add a human readable prefix. - alias_hash = hex(crc32(alias.encode('utf-8')))[2:] - ALIAS_PREFIX_LENGTH = 63 - len(alias_hash) - 1 - alias = "%s_%s" % (alias[:ALIAS_PREFIX_LENGTH], alias_hash) + alias = "%s_%08x" % (alias[:54], crc32(alias.encode('utf-8'))) return alias -- cgit v1.2.3