From 6d2fb3e3ae326e7ed5b7f28c1833932d27e68054 Mon Sep 17 00:00:00 2001 From: Olivier Dony Date: Thu, 24 Jul 2014 12:22:20 +0200 Subject: [PATCH] [FIX] models: check harder that default value is not NULL before setting it When computing defaults we may end up with a falsy value that is not None (e.g. '' or False) That value will be cast to None when being saved in the database, depending on the column type (e.g. saving False on a many2one actually stores NULL). Improve the test to consider the value being written *after* that conversion, to *really* avoid nonsensical and expensive queries such as: UPDATE table set col = NULL WHERE col IS NULL; --- openerp/models.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/openerp/models.py b/openerp/models.py index fffdd93a53c..b6cad209f74 100644 --- a/openerp/models.py +++ b/openerp/models.py @@ -2415,13 +2415,14 @@ class BaseModel(object): if column_name in defaults: default = field.convert_to_write(defaults[column_name]) - if default is not None: - _logger.debug("Table '%s': setting default value of new column %s", - self._table, column_name) - ss = self._columns[column_name]._symbol_set + ss = self._columns[column_name]._symbol_set + store_default = ss[1](default) + if store_default is not None: + _logger.debug("Table '%s': setting default value of new column %s to %r", + self._table, column_name, default) query = 'UPDATE "%s" SET "%s"=%s WHERE "%s" is NULL' % ( self._table, column_name, ss[0], column_name) - cr.execute(query, (ss[1](default),)) + cr.execute(query, (store_default,)) # this is a disgrace cr.commit()