From 2d7617aa186e2db567f42b8e8caaf5d8b6fbc8b2 Mon Sep 17 00:00:00 2001 From: Petr Skoda Date: Fri, 4 Jul 2014 15:04:50 +1200 Subject: [PATCH] MDL-45945 mssql: force default database collation in all tables including temp table --- lib/ddl/mssql_sql_generator.php | 4 ++-- lib/ddl/tests/ddl_test.php | 29 +++++++++++++++++++++++++++++ 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/lib/ddl/mssql_sql_generator.php b/lib/ddl/mssql_sql_generator.php index ccd2d811aec..4faa2b25aae 100644 --- a/lib/ddl/mssql_sql_generator.php +++ b/lib/ddl/mssql_sql_generator.php @@ -218,10 +218,10 @@ class mssql_sql_generator extends sql_generator { if (empty($xmldb_length)) { $xmldb_length='255'; } - $dbtype .= '(' . $xmldb_length . ')'; + $dbtype .= '(' . $xmldb_length . ') COLLATE database_default'; break; case XMLDB_TYPE_TEXT: - $dbtype = 'NVARCHAR(MAX)'; + $dbtype = 'NVARCHAR(MAX) COLLATE database_default'; break; case XMLDB_TYPE_BINARY: $dbtype = 'VARBINARY(MAX)'; diff --git a/lib/ddl/tests/ddl_test.php b/lib/ddl/tests/ddl_test.php index 6fed8e1d4ea..9dac524a953 100644 --- a/lib/ddl/tests/ddl_test.php +++ b/lib/ddl/tests/ddl_test.php @@ -1579,6 +1579,35 @@ class core_ddl_testcase extends database_driver_testcase { $dbman->drop_temp_table($table1); $this->assertFalse($dbman->table_exists('test_table1')); $this->assertDebuggingCalled(); + + // Try join with normal tables - MS SQL may use incompatible collation. + $table1 = new xmldb_table('test_table'); + $table1->add_field('id', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, XMLDB_SEQUENCE, null); + $table1->add_field('name', XMLDB_TYPE_CHAR, 255, null, XMLDB_NOTNULL, null); + $table1->add_key('primary', XMLDB_KEY_PRIMARY, array('id')); + $dbman->create_table($table1); + + $table2 = new xmldb_table('test_temp'); + $table2->add_field('id', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, XMLDB_SEQUENCE, null); + $table2->add_field('name', XMLDB_TYPE_CHAR, 255, null, XMLDB_NOTNULL, null); + $table2->add_key('primary', XMLDB_KEY_PRIMARY, array('id')); + $dbman->create_temp_table($table2); + + $record = array('name' => 'a'); + $DB->insert_record('test_table', $record); + $DB->insert_record('test_temp', $record); + + $record = array('name' => 'b'); + $DB->insert_record('test_table', $record); + + $record = array('name' => 'c'); + $DB->insert_record('test_temp', $record); + + $sql = "SELECT * + FROM {test_table} n + JOIN {test_temp} t ON t.name = n.name"; + $records = $DB->get_records_sql($sql); + $this->assertCount(1, $records); } public function test_concurrent_temp_tables() {