From 6a36fa82c7cba8303c57b8d64a5dbcc555c4715a Mon Sep 17 00:00:00 2001 From: Long TRAN Date: Mon, 7 Feb 2022 05:29:03 +0700 Subject: [PATCH] Fix #19047, fix #19118: Fix deprecated preg_match() passing null parameters #2 in db\mysql\Schema.php --- framework/CHANGELOG.md | 1 + framework/db/mysql/Schema.php | 1 + tests/framework/db/mysql/SchemaTest.php | 31 +++++++++++++++++++++++-- 3 files changed, 31 insertions(+), 2 deletions(-) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index 054abdf6a4f..051b6e54e9c 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -12,6 +12,7 @@ Yii Framework 2 Change Log - Bug #19187: Fix `yii\filters\PageCache` to store original headers names instead of normalized ones (bizley) - Bug #19191: Change `\Exception` to `\Throwable` in `BadRequestHttpException` and `HttpException` (Dmitrijlin) - Bug #19204: Support numbers in Inflector::camel2words (longthanhtran) +- Bug #19047: Fix deprecated preg_match() passing null parameters #2 in db\mysql\Schema.php (longthanhtran) 2.0.44 December 30, 2021 diff --git a/framework/db/mysql/Schema.php b/framework/db/mysql/Schema.php index 87ae9ade780..babb7d2aa9a 100644 --- a/framework/db/mysql/Schema.php +++ b/framework/db/mysql/Schema.php @@ -294,6 +294,7 @@ protected function loadColumnSchema($info) * See details here: https://mariadb.com/kb/en/library/now/#description */ if (($column->type === 'timestamp' || $column->type === 'datetime') + && isset($info['default']) && preg_match('/^current_timestamp(?:\(([0-9]*)\))?$/i', $info['default'], $matches)) { $column->defaultValue = new Expression('CURRENT_TIMESTAMP' . (!empty($matches[1]) ? '(' . $matches[1] . ')' : '')); } elseif (isset($type) && $type === 'bit') { diff --git a/tests/framework/db/mysql/SchemaTest.php b/tests/framework/db/mysql/SchemaTest.php index b5419821e8e..4fd27951f25 100644 --- a/tests/framework/db/mysql/SchemaTest.php +++ b/tests/framework/db/mysql/SchemaTest.php @@ -8,6 +8,8 @@ namespace yiiunit\framework\db\mysql; use yii\db\Expression; +use yii\db\mysql\ColumnSchema; +use yii\db\mysql\Schema; use yiiunit\framework\db\AnyCaseValue; /** @@ -101,7 +103,7 @@ public function testAlternativeDisplayOfDefaultCurrentTimestampInMariaDB() * We do not have a real database MariaDB >= 10.2.3 for tests, so we emulate the information that database * returns in response to the query `SHOW FULL COLUMNS FROM ...` */ - $schema = new \yii\db\mysql\Schema(); + $schema = new Schema(); $column = $this->invokeMethod($schema, 'loadColumnSchema', [[ 'field' => 'emulated_MariaDB_field', 'type' => 'timestamp', @@ -114,11 +116,36 @@ public function testAlternativeDisplayOfDefaultCurrentTimestampInMariaDB() 'comment' => '', ]]); - $this->assertInstanceOf(\yii\db\mysql\ColumnSchema::className(), $column); + $this->assertInstanceOf(ColumnSchema::className(), $column); $this->assertInstanceOf(Expression::className(), $column->defaultValue); $this->assertEquals('CURRENT_TIMESTAMP', $column->defaultValue); } + /** + * When displayed in the INFORMATION_SCHEMA.COLUMNS table, a default CURRENT TIMESTAMP is provided + * as NULL. + * + * @see https://github.com/yiisoft/yii2/issues/19047 + */ + public function testAlternativeDisplayOfDefaultCurrentTimestampAsNullInMariaDB() + { + $schema = new Schema(); + $column = $this->invokeMethod($schema, 'loadColumnSchema', [[ + 'field' => 'emulated_MariaDB_field', + 'type' => 'timestamp', + 'collation' => NULL, + 'null' => 'NO', + 'key' => '', + 'default' => NULL, + 'extra' => '', + 'privileges' => 'select,insert,update,references', + 'comment' => '', + ]]); + + $this->assertInstanceOf(ColumnSchema::className(), $column); + $this->assertEquals(NULL, $column->defaultValue); + } + public function getExpectedColumns() { $version = $this->getConnection()->getSchema()->getServerVersion();