From 5a931d5914577ab9dfbb7a135140a21e88ebe17c Mon Sep 17 00:00:00 2001 From: IKEDA Soji Date: Mon, 18 Oct 2021 18:39:35 +0900 Subject: [PATCH] MySQL: probe_db() cannot update int fields with MySQL 8.0.17 or later (#1252) --- src/lib/Sympa/Database.pm | 25 +++++++++++++++++++++++++ src/lib/Sympa/DatabaseDriver/MySQL.pm | 14 ++++++++++++++ src/lib/Sympa/DatabaseManager.pm | 6 +++--- 3 files changed, 42 insertions(+), 3 deletions(-) diff --git a/src/lib/Sympa/Database.pm b/src/lib/Sympa/Database.pm index fd27587ef..2ca09bd5e 100644 --- a/src/lib/Sympa/Database.pm +++ b/src/lib/Sympa/Database.pm @@ -430,6 +430,31 @@ sub error { return undef; } +# Old name: Sympa::DatabaseManager::_check_db_field_type(). +sub is_sufficient_field_type { + my $self = shift; + my $required = shift; + my $effective = shift; + + my ($required_type, $required_size, $effective_type, $effective_size); + + if ($required =~ /^(\w+)(\((\d+)\))?$/) { + ($required_type, $required_size) = ($1, $3); + } + + if ($effective =~ /^(\w+)(\((\d+)\))?$/) { + ($effective_type, $effective_size) = ($1, $3); + } + + if ( ($effective_type // '') eq ($required_type // '') + and (not defined $required_size or $effective_size >= $required_size)) + { + return 1; + } + + return 0; +} + sub set_persistent { my $self = shift; my $flag = shift; diff --git a/src/lib/Sympa/DatabaseDriver/MySQL.pm b/src/lib/Sympa/DatabaseDriver/MySQL.pm index eae3e7383..c9f1c6f73 100644 --- a/src/lib/Sympa/DatabaseDriver/MySQL.pm +++ b/src/lib/Sympa/DatabaseDriver/MySQL.pm @@ -330,6 +330,20 @@ sub get_primary_key { return \%found_keys; } +sub is_sufficient_field_type { + my $self = shift; + my $required = shift; + my $actual = shift; + + # As of MySQL 8.0.17, the display width attribute is deprecated for + # integer data types (MeriaDB has not). + if ($required =~ /\A((?:tiny|small|medium|big)?int)(?:[(]\d+[)])?\z/ + and $actual eq $1) { + return 1; + } + return $self->SUPER::is_sufficient_field_type($required, $actual); +} + sub unset_primary_key { my $self = shift; my $param = shift; diff --git a/src/lib/Sympa/DatabaseManager.pm b/src/lib/Sympa/DatabaseManager.pm index 2283921dc..ff144545e 100644 --- a/src/lib/Sympa/DatabaseManager.pm +++ b/src/lib/Sympa/DatabaseManager.pm @@ -361,9 +361,9 @@ sub _check_fields { ## Change DB types if different and if update_db_types enabled if ($may_update) { unless ( - _check_db_field_type( - effective_format => $real_struct{$t}{$f}, - required_format => $db_struct->{$t}->{$f} + $sdm->is_sufficient_field_type( + $db_struct->{$t}->{$f}, + $real_struct{$t}{$f} ) ) { push @{$report_ref},