From f93c934043444ffb84fc885000e197345b725be8 Mon Sep 17 00:00:00 2001 From: "Eloy Lafuente (stronk7)" Date: Sun, 18 Oct 2020 11:53:37 +0200 Subject: [PATCH 1/2] MDL-69973 xmldb: Fix problem with MariaDB >= 10.2.7 metadata defaults With MariaDB 10.2.7 the driver was incorrectly returning '' (empty string) as default for all the columns having null (meaning, no default). Also, cover the case in unit tests, it seems that we were already testing other defaults but not the null case. --- lib/dml/mysqli_native_moodle_database.php | 2 +- lib/dml/tests/dml_test.php | 38 +++++++++++++++++++++-- 2 files changed, 37 insertions(+), 3 deletions(-) diff --git a/lib/dml/mysqli_native_moodle_database.php b/lib/dml/mysqli_native_moodle_database.php index 69143936174..8d99b01b14b 100644 --- a/lib/dml/mysqli_native_moodle_database.php +++ b/lib/dml/mysqli_native_moodle_database.php @@ -860,7 +860,7 @@ class mysqli_native_moodle_database extends moodle_database { $info->type = $rawcolumn->data_type; $info->meta_type = $this->mysqltype2moodletype($rawcolumn->data_type); if ($this->has_breaking_change_quoted_defaults()) { - $info->default_value = trim($rawcolumn->column_default, "'"); + $info->default_value = is_null($rawcolumn->column_default) ? null : trim($rawcolumn->column_default, "'"); if ($info->default_value === 'NULL') { $info->default_value = null; } diff --git a/lib/dml/tests/dml_test.php b/lib/dml/tests/dml_test.php index 6e472b59bad..72c93bbe1a5 100644 --- a/lib/dml/tests/dml_test.php +++ b/lib/dml/tests/dml_test.php @@ -660,9 +660,13 @@ class core_dml_testcase extends database_driver_testcase { $table->add_field('course', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, '0'); $table->add_field('name', XMLDB_TYPE_CHAR, '255', null, null, null, 'lala'); $table->add_field('description', XMLDB_TYPE_TEXT, 'small', null, null, null, null); + $table->add_field('oneint', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, '0'); + $table->add_field('oneintnodefault', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null); $table->add_field('enumfield', XMLDB_TYPE_CHAR, '255', null, XMLDB_NOTNULL, null, 'test2'); $table->add_field('onenum', XMLDB_TYPE_NUMBER, '10,2', null, null, null, 200); - $table->add_field('onefloat', XMLDB_TYPE_FLOAT, '10,2', null, null, null, 300); + $table->add_field('onenumnodefault', XMLDB_TYPE_NUMBER, '10,2', null, null, null); + $table->add_field('onefloat', XMLDB_TYPE_FLOAT, '10,2', null, XMLDB_NOTNULL, null, 300); + $table->add_field('onefloatnodefault', XMLDB_TYPE_FLOAT, '10,2', null, XMLDB_NOTNULL, null); $table->add_field('anotherfloat', XMLDB_TYPE_FLOAT, null, null, null, null, 400); $table->add_field('negativedfltint', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, '-1'); $table->add_field('negativedfltnumber', XMLDB_TYPE_NUMBER, '10', null, XMLDB_NOTNULL, null, '-2'); @@ -723,6 +727,20 @@ class core_dml_testcase extends database_driver_testcase { $this->assertNull($field->default_value); $this->assertFalse($field->not_null); + $field = $columns['oneint']; + $this->assertSame('I', $field->meta_type); + $this->assertFalse($field->auto_increment); + $this->assertTrue($field->has_default); + $this->assertEquals(0, $field->default_value); + $this->assertTrue($field->not_null); + + $field = $columns['oneintnodefault']; + $this->assertSame('I', $field->meta_type); + $this->assertFalse($field->auto_increment); + $this->assertFalse($field->has_default); + $this->assertNull($field->default_value); + $this->assertTrue($field->not_null); + $field = $columns['enumfield']; $this->assertSame('C', $field->meta_type); $this->assertFalse($field->auto_increment); @@ -738,12 +756,28 @@ class core_dml_testcase extends database_driver_testcase { $this->assertEquals(200.0, $field->default_value); $this->assertFalse($field->not_null); + $field = $columns['onenumnodefault']; + $this->assertSame('N', $field->meta_type); + $this->assertFalse($field->auto_increment); + $this->assertEquals(10, $field->max_length); + $this->assertEquals(2, $field->scale); + $this->assertFalse($field->has_default); + $this->assertNull($field->default_value); + $this->assertFalse($field->not_null); + $field = $columns['onefloat']; $this->assertSame('N', $field->meta_type); $this->assertFalse($field->auto_increment); $this->assertTrue($field->has_default); $this->assertEquals(300.0, $field->default_value); - $this->assertFalse($field->not_null); + $this->assertTrue($field->not_null); + + $field = $columns['onefloatnodefault']; + $this->assertSame('N', $field->meta_type); + $this->assertFalse($field->auto_increment); + $this->assertFalse($field->has_default); + $this->assertNull($field->default_value); + $this->assertTrue($field->not_null); $field = $columns['anotherfloat']; $this->assertSame('N', $field->meta_type); From 87dca5dfd77acede82e56ca1e14aac76c4f9a218 Mon Sep 17 00:00:00 2001 From: "Eloy Lafuente (stronk7)" Date: Sun, 18 Oct 2020 11:59:59 +0200 Subject: [PATCH 2/2] MDL-69973 xmldb: Ensure all reports use fresh metadata (not cached) --- admin/tool/xmldb/actions/XMLDBCheckAction.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/admin/tool/xmldb/actions/XMLDBCheckAction.class.php b/admin/tool/xmldb/actions/XMLDBCheckAction.class.php index 2514c6170ed..5ffc70e3f7f 100644 --- a/admin/tool/xmldb/actions/XMLDBCheckAction.class.php +++ b/admin/tool/xmldb/actions/XMLDBCheckAction.class.php @@ -149,7 +149,7 @@ abstract class XMLDBCheckAction extends XMLDBAction { continue; } // Fetch metadata from physical DB. All the columns info. - if (!$metacolumns = $DB->get_columns($xmldb_table->getName())) { + if (!$metacolumns = $DB->get_columns($xmldb_table->getName(), false)) { // / Skip table if no metacolumns is available for it continue; }