diff --git a/lib/dml/oci_native_moodle_database.php b/lib/dml/oci_native_moodle_database.php index 943dbbb7ec4..a007e6601ef 100644 --- a/lib/dml/oci_native_moodle_database.php +++ b/lib/dml/oci_native_moodle_database.php @@ -477,8 +477,11 @@ class oci_native_moodle_database extends moodle_database { $this->columns[$table] = array(); - $sql = "SELECT CNAME, COLTYPE, WIDTH, SCALE, PRECISION, NULLS, DEFAULTVAL - FROM COL + // We give precedence to CHAR_LENGTH for VARCHAR2 columns over WIDTH because the former is always + // BYTE based and, for cross-db operations, we want CHAR based results. See MDL-29415 + $sql = "SELECT CNAME, COLTYPE, nvl(CHAR_LENGTH, WIDTH) AS WIDTH, SCALE, PRECISION, NULLS, DEFAULTVAL + FROM COL c + LEFT JOIN USER_TAB_COLUMNS u ON (u.TABLE_NAME = c.TNAME AND u.COLUMN_NAME = c.CNAME AND u.DATA_TYPE = 'VARCHAR2') WHERE TNAME = UPPER('{" . $table . "}') ORDER BY COLNO"; diff --git a/lib/dml/simpletest/testdml.php b/lib/dml/simpletest/testdml.php index f44e25830a3..a4e6e9327a2 100644 --- a/lib/dml/simpletest/testdml.php +++ b/lib/dml/simpletest/testdml.php @@ -751,6 +751,7 @@ class dml_test extends UnitTestCase { $field = $columns['name']; $this->assertEqual('C', $field->meta_type); $this->assertFalse($field->auto_increment); + $this->assertEqual(255, $field->max_length); $this->assertTrue($field->has_default); $this->assertIdentical('lala', $field->default_value); $this->assertFalse($field->not_null);