details:   https://code.tryton.org/tryton/commit/a50b564c40d1
branch:    default
user:      Cédric Krier <[email protected]>
date:      Fri Jun 26 00:09:48 2026 +0200
description:
        Add support for reducing size of char if all rows are lower
diffstat:

 trytond/trytond/backend/postgresql/table.py |  21 +++++++++++++++------
 trytond/trytond/backend/sqlite/table.py     |  21 +++++++++++++++------
 2 files changed, 30 insertions(+), 12 deletions(-)

diffs (69 lines):

diff -r 74f84aeb1225 -r a50b564c40d1 trytond/trytond/backend/postgresql/table.py
--- a/trytond/trytond/backend/postgresql/table.py       Thu Jul 02 16:40:30 
2026 +0200
+++ b/trytond/trytond/backend/postgresql/table.py       Fri Jun 26 00:09:48 
2026 +0200
@@ -384,12 +384,21 @@
                 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 -r 74f84aeb1225 -r a50b564c40d1 trytond/trytond/backend/sqlite/table.py
--- a/trytond/trytond/backend/sqlite/table.py   Thu Jul 02 16:40:30 2026 +0200
+++ b/trytond/trytond/backend/sqlite/table.py   Fri Jun 26 00:09:48 2026 +0200
@@ -200,6 +200,7 @@
 
     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 @@
                 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()

Reply via email to