From 51402a9c42b74c71b66324b40690f49bf8536658 Mon Sep 17 00:00:00 2001 From: Sergey Shevchenko Date: Thu, 29 Oct 2020 10:54:52 +1300 Subject: [PATCH] fix: don't use int width for mysql > 8.0.17 #9453 --- src/ORM/Connect/MySQLSchemaManager.php | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/src/ORM/Connect/MySQLSchemaManager.php b/src/ORM/Connect/MySQLSchemaManager.php index 701eae4c7..974ac90f9 100644 --- a/src/ORM/Connect/MySQLSchemaManager.php +++ b/src/ORM/Connect/MySQLSchemaManager.php @@ -241,6 +241,14 @@ class MySQLSchemaManager extends DBSchemaManager protected static $_cache_collation_info = []; + public function shouldUseIntegerWidth() + { + // MySQL 8.0.17 stopped reporting the width attribute for integers + // https://github.com/silverstripe/silverstripe-framework/issues/9453 + $v = $this->database->getVersion(); + return version_compare($v,'8.0.17','<'); + } + public function fieldList($table) { $fields = $this->query("SHOW FULL FIELDS IN \"$table\""); @@ -405,7 +413,8 @@ class MySQLSchemaManager extends DBSchemaManager //'default'=>$this->default); //DB::requireField($this->tableName, $this->name, "tinyint(1) unsigned not null default //'{$this->defaultVal}'"); - return 'tinyint(1) unsigned not null' . $this->defaultClause($values); + $width = $this->shouldUseIntegerWidth() ? '(1)' : ''; + return 'tinyint'.$width.' unsigned not null' . $this->defaultClause($values); } /** @@ -518,7 +527,8 @@ class MySQLSchemaManager extends DBSchemaManager //For reference, this is what typically gets passed to this function: //$parts=Array('datatype'=>'int', 'precision'=>11, 'null'=>'not null', 'default'=>(int)$this->default); //DB::requireField($this->tableName, $this->name, "int(11) not null default '{$this->defaultVal}'"); - return "int(11) not null" . $this->defaultClause($values); + $width = $this->shouldUseIntegerWidth() ? '(11)' : ''; + return "int$width not null" . $this->defaultClause($values); } /** @@ -534,8 +544,8 @@ class MySQLSchemaManager extends DBSchemaManager // 'arrayValue'=>$this->arrayValue); //$values=Array('type'=>'bigint', 'parts'=>$parts); //DB::requireField($this->tableName, $this->name, $values); - - return 'bigint(20) not null' . $this->defaultClause($values); + $width = $this->shouldUseIntegerWidth() ? '(20)' : ''; + return 'bigint'.$width.' not null' . $this->defaultClause($values); } /** @@ -616,7 +626,8 @@ class MySQLSchemaManager extends DBSchemaManager public function IdColumn($asDbValue = false, $hasAutoIncPK = true) { - return 'int(11) not null auto_increment'; + $width = $this->shouldUseIntegerWidth() ? '(11)' : ''; + return 'int'.$width.' not null auto_increment'; } /**