[FIX] expression: when evaluatoing *like operator, add cast to text to column in...
authorjba <>
Wed, 9 Apr 2014 14:43:46 +0000 (16:43 +0200)
committerMartin Trigaux <mat@openerp.com>
Wed, 9 Apr 2014 14:43:46 +0000 (16:43 +0200)
bzr revid: mat@openerp.com-20140409144346-nbn0dno3bs6ozwk5

openerp/addons/base/tests/test_expression.py
openerp/osv/expression.py

index a89ae19..bbdaa69 100644 (file)
@@ -183,7 +183,7 @@ class test_expression(common.TransactionCase):
         self.assertIn('res_partner_bank', sql_query[0],
             "_auto_join off: ('bank_ids.name', 'like', '..') first query incorrect main table")
 
-        expected = "%s like %s" % (unaccent('"res_partner_bank"."name"'), unaccent('%s'))
+        expected = "%s::text like %s" % (unaccent('"res_partner_bank"."name"'), unaccent('%s'))
         self.assertIn(expected, sql_query[1],
             "_auto_join off: ('bank_ids.name', 'like', '..') first query incorrect where condition")
         
@@ -223,7 +223,7 @@ class test_expression(common.TransactionCase):
         self.assertIn('"res_partner_bank" as "res_partner__bank_ids"', sql_query[0],
             "_auto_join on: ('bank_ids.name', 'like', '..') query incorrect join")
 
-        expected = "%s like %s" % (unaccent('"res_partner__bank_ids"."name"'), unaccent('%s'))
+        expected = "%s::text like %s" % (unaccent('"res_partner__bank_ids"."name"'), unaccent('%s'))
         self.assertIn(expected, sql_query[1],
             "_auto_join on: ('bank_ids.name', 'like', '..') query incorrect where condition")
         
@@ -305,7 +305,7 @@ class test_expression(common.TransactionCase):
         self.assertIn('"res_country"', sql_query[0],
             "_auto_join on for state_id: ('state_id.country_id.code', 'like', '..') query 1 incorrect main table")
 
-        expected = "%s like %s" % (unaccent('"res_country"."code"'), unaccent('%s'))
+        expected = "%s::text like %s" % (unaccent('"res_country"."code"'), unaccent('%s'))
         self.assertIn(expected, sql_query[1],
             "_auto_join on for state_id: ('state_id.country_id.code', 'like', '..') query 1 incorrect where condition")
 
@@ -339,7 +339,7 @@ class test_expression(common.TransactionCase):
         self.assertIn('"res_country" as "res_country_state__country_id"', sql_query[0],
             "_auto_join on for country_id: ('state_id.country_id.code', 'like', '..') query 1 incorrect join")
 
-        expected = "%s like %s" % (unaccent('"res_country_state__country_id"."code"'), unaccent('%s'))
+        expected = "%s::text like %s" % (unaccent('"res_country_state__country_id"."code"'), unaccent('%s'))
         self.assertIn(expected, sql_query[1],
             "_auto_join on for country_id: ('state_id.country_id.code', 'like', '..') query 1 incorrect where condition")
         
@@ -373,7 +373,7 @@ class test_expression(common.TransactionCase):
         self.assertIn('"res_country" as "res_partner__state_id__country_id"', sql_query[0],
             "_auto_join on: ('state_id.country_id.code', 'like', '..') query incorrect join")
 
-        expected = "%s like %s" % (unaccent('"res_partner__state_id__country_id"."code"'), unaccent('%s'))
+        expected = "%s::text like %s" % (unaccent('"res_partner__state_id__country_id"."code"'), unaccent('%s'))
         self.assertIn(expected, sql_query[1],
             "_auto_join on: ('state_id.country_id.code', 'like', '..') query incorrect where condition")
         
@@ -403,7 +403,7 @@ class test_expression(common.TransactionCase):
         # Test produced queries that domains effectively present
         sql_query = self.query_list[0].get_sql()
         
-        expected = "%s like %s" % (unaccent('"res_partner__child_ids__bank_ids"."acc_number"'), unaccent('%s'))
+        expected = "%s::text like %s" % (unaccent('"res_partner__child_ids__bank_ids"."acc_number"'), unaccent('%s'))
         self.assertIn(expected, sql_query[1],
             "_auto_join on one2many with domains incorrect result")
         # TDE TODO: check first domain has a correct table name
index da49ae1..68ad4c2 100644 (file)
@@ -1181,14 +1181,15 @@ class expression(object):
         else:
             need_wildcard = operator in ('like', 'ilike', 'not like', 'not ilike')
             sql_operator = {'=like': 'like', '=ilike': 'ilike'}.get(operator, operator)
+            cast = '::text' if  sql_operator.endswith('like') else ''
 
             if left in model._columns:
                 format = need_wildcard and '%s' or model._columns[left]._symbol_set[0]
                 unaccent = self._unaccent if sql_operator.endswith('like') else lambda x: x
                 column = '%s.%s' % (table_alias, _quote(left))
-                query = '(%s %s %s)' % (unaccent(column), sql_operator, unaccent(format))
+                query = '(%s%s %s %s)' % (unaccent(column), cast, sql_operator, unaccent(format))
             elif left in MAGIC_COLUMNS:
-                    query = "(%s.\"%s\" %s %%s)" % (table_alias, left, sql_operator)
+                    query = "(%s.\"%s\"%s %s %%s)" % (table_alias, left, cast, sql_operator)
                     params = right
             else:  # Must not happen
                 raise ValueError("Invalid field %r in domain term %r" % (left, leaf))