From 533c35ff9918bdd755c70713dab8922f2b95fe8a Mon Sep 17 00:00:00 2001 From: "Eloy Lafuente (stronk7)" Date: Sun, 18 Oct 2020 11:53:37 +0200 Subject: [PATCH] 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 599913a4326..44595021875 100644 --- a/lib/dml/mysqli_native_moodle_database.php +++ b/lib/dml/mysqli_native_moodle_database.php @@ -886,7 +886,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 bff9b970acf..5a3682680b8 100644 --- a/lib/dml/tests/dml_test.php +++ b/lib/dml/tests/dml_test.php @@ -722,9 +722,13 @@ EOD; $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'); @@ -785,6 +789,20 @@ EOD; $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); @@ -800,12 +818,28 @@ EOD; $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);