From aacc97f905151c05ceb903d676bb49b03bf481ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Krier?= Date: Fri, 26 Jun 2026 00:09:48 +0200 Subject: [PATCH] Add support for reducing size of char if all rows are lower --- trytond/trytond/backend/postgresql/table.py | 21 +++++++++++++++------ trytond/trytond/backend/sqlite/table.py | 21 +++++++++++++++------ 2 files changed, 30 insertions(+), 12 deletions(-) diff --git a/trytond/trytond/backend/postgresql/table.py b/trytond/trytond/backend/postgresql/table.py index 1e2bd49786..027c6b0017 100644 --- a/trytond/trytond/backend/postgresql/table.py +++ b/trytond/trytond/backend/postgresql/table.py @@ -384,12 +384,21 @@ class TableHandler(TableHandlerInterface): elif from_size and from_size < field_size: self.alter_size(column_name, column_type[1]) else: - logger.warning( - 'Unable to migrate column %s on table %s ' - 'from varchar(%s) to varchar(%s).', - column_name, self.table_name, - from_size if from_size and from_size > 0 else "", - field_size) + cursor.execute(SQL( + 'SELECT id FROM {} ' + 'WHERE CHAR_LENGTH({}) > %s LIMIT 1').format( + Identifier(self.table_name), + Identifier(column_name)), + (field_size,)) + if not cursor.rowcount: + self.alter_size(column_name, column_type[1]) + else: + logger.warning( + 'Unable to migrate column %s on table %s ' + 'from varchar(%s) to varchar(%s).', + column_name, self.table_name, + from_size if from_size and from_size > 0 else "", + field_size) return column_type = column_type[1] diff --git a/trytond/trytond/backend/sqlite/table.py b/trytond/trytond/backend/sqlite/table.py index bb576c98ff..c43ea70f2a 100644 --- a/trytond/trytond/backend/sqlite/table.py +++ b/trytond/trytond/backend/sqlite/table.py @@ -200,6 +200,7 @@ class TableHandler(TableHandlerInterface): def _add_raw_column( self, column_name, column_type, default=None, field_size=None): + cursor = Transaction().connection.cursor() if self.column_exist(column_name): base_type = column_type[0].upper() if base_type != self._columns[column_name]['typname']: @@ -231,12 +232,20 @@ class TableHandler(TableHandlerInterface): elif from_size and from_size < field_size: self.alter_size(column_name, column_type[1]) else: - logger.warning( - 'Unable to migrate column %s on table %s ' - 'from varchar(%s) to varchar(%s).', - column_name, self.table_name, - from_size if from_size and from_size > 0 else "", - field_size) + cursor.execute( + 'SELECT id FROM %s WHERE LENGTH(%s) > %%s LIMIT 1' % ( + _escape_identifier(self.table_name), + _escape_identifier(column_name)), + (field_size,)) + if not cursor.fetchone(): + self.alter_size(column_name, column_type[1]) + else: + logger.warning( + 'Unable to migrate column %s on table %s ' + 'from varchar(%s) to varchar(%s).', + column_name, self.table_name, + from_size if from_size and from_size > 0 else "", + field_size) return cursor = Transaction().connection.cursor()