[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#57944 X-original-commit: 40b97b37e2188b082cd70eec1cdf14bf9366377e Signed-off-by: Raphael Collet (rco) <rco@openerp.com>
This commit is contained in:
committed by
Raphael Collet
parent
3cf3b17213
commit
7079d747e7
@@ -0,0 +1,16 @@
|
||||
United Kingdom, 2020-07-21
|
||||
|
||||
Coloop Ltd. agrees to the terms of the Odoo Corporate Contributor License
|
||||
Agreement v1.0.
|
||||
|
||||
I declare that I am authorized and able to make this agreement and sign this
|
||||
declaration.
|
||||
|
||||
Signed,
|
||||
|
||||
Alex Hafner alex.hafner@coloop.com https://github.com/alexhafner
|
||||
|
||||
List of contributors:
|
||||
|
||||
Alex Hafner alex.hafner@coloop.com https://github.com/alexhafner
|
||||
Herbert Riess herbert.riess@coloop.com https://github.com/r13ssh
|
||||
@@ -79,7 +79,7 @@ class QueryTestCase(BaseCase):
|
||||
tmp_cat_cmp_par = query.join(tmp_cat_cmp, 'partner_id', 'res_partner', 'id', 'partner_id')
|
||||
self.assertEqual(tmp_cat_cmp_par, 'product_product__product_tmpl_id__product_category_id__56d55687')
|
||||
tmp_cat_stm_par = query.join(tmp_cat_stm, 'partner_id', 'res_partner', 'id', 'partner_id')
|
||||
self.assertEqual(tmp_cat_stm_par, 'product_product__product_tmpl_id__product_category_id__9_363fdd')
|
||||
self.assertEqual(tmp_cat_stm_par, 'product_product__product_tmpl_id__product_category_id__00363fdd')
|
||||
|
||||
def test_table_expression(self):
|
||||
query = Query(None, 'foo')
|
||||
|
||||
+1
-3
@@ -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
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user