~initos.com/openobject-server/trunk-bug-1314037

« back to all changes in this revision

Viewing changes to openerp/osv/expression.py

  • Committer: Thomas Rehn
  • Date: 2014-04-29 10:49:46 UTC
  • Revision ID: thomas.rehn@initos.com-20140429104946-jhwqiajy60e04z2b
offer alternative scheme to generate table aliases

Show diffs side-by-side

added added

removed removed

Lines of Context:
134
134
 
135
135
import logging
136
136
import traceback
 
137
import hashlib
137
138
 
138
139
import openerp.modules
139
140
from openerp.osv import fields
341
342
        return '%s' % alias, '%s' % _quote(alias)
342
343
    for link in joined_tables:
343
344
        alias += '__' + link[1]
344
 
    assert len(alias) < 64, 'Table alias name %s is longer than the 64 characters size accepted by default in postgresql.' % alias
 
345
    # Use an alternate alias scheme if length exceeds the PostgreSQL limit 
 
346
    #  of 63 characters.
 
347
    if len(alias) >= 64:
 
348
        # We have to fit a 160 bit hash (= 40 characters) and one underscore
 
349
        #  into a 63 character alias. The remaining space we can use to add 
 
350
        #  a human readable prefix.
 
351
        ALIAS_PREFIX_LENGTH = 63 - 40 - 1
 
352
        alias = "%s_%s" % (alias[:ALIAS_PREFIX_LENGTH],
 
353
                           hashlib.sha1(alias).hexdigest())
345
354
    return '%s' % alias, '%s as %s' % (_quote(joined_tables[-1][0]), _quote(alias))
346
355
 
347
356
 
551
560
    def get_join_conditions(self):
552
561
        conditions = []
553
562
        alias = self._models[0]._table
 
563
        links = []
554
564
        for context in self.join_context:
555
565
            previous_alias = alias
556
 
            alias += '__' + context[4]
 
566
            links.append((context[1]._table, context[4]))
 
567
            alias, _ = generate_table_alias(self._models[0]._table, links)
557
568
            conditions.append('"%s"."%s"="%s"."%s"' % (previous_alias, context[2], alias, context[3]))
558
569
        return conditions
559
570