Loading core/lib/Drupal/Core/Database/Query/Select.php +4 −2 Original line number Diff line number Diff line Loading @@ -807,13 +807,15 @@ public function __toString() { $fields = []; foreach ($this->tables as $alias => $table) { if (!empty($table['all_fields'])) { $fields[] = $this->connection->escapeTable($alias) . '.*'; $fields[] = $this->connection->escapeAlias($alias) . '.*'; } } foreach ($this->fields as $field) { // Note that $field['table'] holds the table_alias. // @see \Drupal\Core\Database\Query\Select::addField $table = isset($field['table']) ? $field['table'] . '.' : ''; // Always use the AS keyword for field aliases, as some // databases require it (e.g., PostgreSQL). $table = isset($field['table']) ? $field['table'] . '.' : ''; $fields[] = $this->connection->escapeField($table . $field['field']) . ' AS ' . $this->connection->escapeAlias($field['alias']); } foreach ($this->expressions as $expression) { Loading core/modules/system/tests/modules/database_test/database_test.install +16 −0 Original line number Diff line number Diff line Loading @@ -331,6 +331,22 @@ function database_test_schema() { 'primary key' => ['id'], ]; $schema['virtual'] = [ 'description' => 'A simple table with reserved name in MySQL 8.', 'fields' => [ 'id' => [ 'description' => 'Simple unique ID.', 'type' => 'int', 'not null' => TRUE, ], 'function' => [ 'description' => 'A column with reserved name in MySQL 8.', 'type' => 'text', ], ], 'primary key' => ['id'], ]; $schema['TEST_UPPERCASE'] = $schema['test']; return $schema; Loading core/tests/Drupal/KernelTests/Core/Database/DatabaseTestBase.php +8 −0 Original line number Diff line number Diff line Loading @@ -37,6 +37,7 @@ protected function setUp() { 'test_serialized', 'TEST_UPPERCASE', 'select', 'virtual', ]); self::addSampleData(); } Loading Loading @@ -163,6 +164,13 @@ public static function addSampleData() { 'update' => 'Update value 1', ]) ->execute(); $connection->insert('virtual') ->fields([ 'id' => 1, 'function' => 'Function value 1', ]) ->execute(); } } core/tests/Drupal/KernelTests/Core/Database/ReservedWordTest.php 0 → 100644 +83 −0 Original line number Diff line number Diff line <?php namespace Drupal\KernelTests\Core\Database; /** * Tests queries that include reserved words. * * @group Database */ class ReservedWordTest extends DatabaseTestBase { /** * Tests SELECT count query from a table with a reserved name. */ public function testSelectReservedWordTableCount() { $query = $this->connection->select('virtual'); $num_records = $query->countQuery()->execute()->fetchField(); $this->assertSame('1', $num_records); } /** * Tests SELECT query with a specific field from a table with a reserved name. */ public function testSelectReservedWordTableSpecificField() { $query = $this->connection->select('virtual'); $query->addField('virtual', 'function'); $rows = $query->execute()->fetchCol(); $this->assertSame('Function value 1', $rows[0]); } /** * Tests SELECT query with all fields from a table with a reserved name. */ public function testSelectReservedWordTableAllFields() { $query = $this->connection->select('virtual'); $query->fields('virtual'); $result = $query->execute()->fetchObject(); $this->assertSame('Function value 1', $result->function); } /** * Tests SELECT count query from a table with a reserved alias. */ public function testSelectReservedWordAliasCount() { $query = $this->connection->select('test', 'character'); $num_records = $query->countQuery()->execute()->fetchField(); $this->assertSame('4', $num_records); } /** * Tests SELECT query with specific fields from a table with a reserved alias. */ public function testSelectReservedWordAliasSpecificFields() { $query = $this->connection->select('test', 'high_priority'); $query->addField('high_priority', 'name'); $query->addField('high_priority', 'age', 'age'); $query->condition('age', 27); $record = $query->execute()->fetchObject(); // Ensure that we got the right record. $this->assertSame('George', $record->name); $this->assertSame('27', $record->age); } /** * Tests SELECT query with all fields from a table with a reserved alias. */ public function testSelectReservedWordAliasAllFields() { $record = $this->connection->select('test', 'signal') ->fields('signal') ->condition('age', 27) ->execute()->fetchObject(); // Ensure that we got the right record. $this->assertSame('George', $record->name); $this->assertSame('27', $record->age); } } Loading
core/lib/Drupal/Core/Database/Query/Select.php +4 −2 Original line number Diff line number Diff line Loading @@ -807,13 +807,15 @@ public function __toString() { $fields = []; foreach ($this->tables as $alias => $table) { if (!empty($table['all_fields'])) { $fields[] = $this->connection->escapeTable($alias) . '.*'; $fields[] = $this->connection->escapeAlias($alias) . '.*'; } } foreach ($this->fields as $field) { // Note that $field['table'] holds the table_alias. // @see \Drupal\Core\Database\Query\Select::addField $table = isset($field['table']) ? $field['table'] . '.' : ''; // Always use the AS keyword for field aliases, as some // databases require it (e.g., PostgreSQL). $table = isset($field['table']) ? $field['table'] . '.' : ''; $fields[] = $this->connection->escapeField($table . $field['field']) . ' AS ' . $this->connection->escapeAlias($field['alias']); } foreach ($this->expressions as $expression) { Loading
core/modules/system/tests/modules/database_test/database_test.install +16 −0 Original line number Diff line number Diff line Loading @@ -331,6 +331,22 @@ function database_test_schema() { 'primary key' => ['id'], ]; $schema['virtual'] = [ 'description' => 'A simple table with reserved name in MySQL 8.', 'fields' => [ 'id' => [ 'description' => 'Simple unique ID.', 'type' => 'int', 'not null' => TRUE, ], 'function' => [ 'description' => 'A column with reserved name in MySQL 8.', 'type' => 'text', ], ], 'primary key' => ['id'], ]; $schema['TEST_UPPERCASE'] = $schema['test']; return $schema; Loading
core/tests/Drupal/KernelTests/Core/Database/DatabaseTestBase.php +8 −0 Original line number Diff line number Diff line Loading @@ -37,6 +37,7 @@ protected function setUp() { 'test_serialized', 'TEST_UPPERCASE', 'select', 'virtual', ]); self::addSampleData(); } Loading Loading @@ -163,6 +164,13 @@ public static function addSampleData() { 'update' => 'Update value 1', ]) ->execute(); $connection->insert('virtual') ->fields([ 'id' => 1, 'function' => 'Function value 1', ]) ->execute(); } }
core/tests/Drupal/KernelTests/Core/Database/ReservedWordTest.php 0 → 100644 +83 −0 Original line number Diff line number Diff line <?php namespace Drupal\KernelTests\Core\Database; /** * Tests queries that include reserved words. * * @group Database */ class ReservedWordTest extends DatabaseTestBase { /** * Tests SELECT count query from a table with a reserved name. */ public function testSelectReservedWordTableCount() { $query = $this->connection->select('virtual'); $num_records = $query->countQuery()->execute()->fetchField(); $this->assertSame('1', $num_records); } /** * Tests SELECT query with a specific field from a table with a reserved name. */ public function testSelectReservedWordTableSpecificField() { $query = $this->connection->select('virtual'); $query->addField('virtual', 'function'); $rows = $query->execute()->fetchCol(); $this->assertSame('Function value 1', $rows[0]); } /** * Tests SELECT query with all fields from a table with a reserved name. */ public function testSelectReservedWordTableAllFields() { $query = $this->connection->select('virtual'); $query->fields('virtual'); $result = $query->execute()->fetchObject(); $this->assertSame('Function value 1', $result->function); } /** * Tests SELECT count query from a table with a reserved alias. */ public function testSelectReservedWordAliasCount() { $query = $this->connection->select('test', 'character'); $num_records = $query->countQuery()->execute()->fetchField(); $this->assertSame('4', $num_records); } /** * Tests SELECT query with specific fields from a table with a reserved alias. */ public function testSelectReservedWordAliasSpecificFields() { $query = $this->connection->select('test', 'high_priority'); $query->addField('high_priority', 'name'); $query->addField('high_priority', 'age', 'age'); $query->condition('age', 27); $record = $query->execute()->fetchObject(); // Ensure that we got the right record. $this->assertSame('George', $record->name); $this->assertSame('27', $record->age); } /** * Tests SELECT query with all fields from a table with a reserved alias. */ public function testSelectReservedWordAliasAllFields() { $record = $this->connection->select('test', 'signal') ->fields('signal') ->condition('age', 27) ->execute()->fetchObject(); // Ensure that we got the right record. $this->assertSame('George', $record->name); $this->assertSame('27', $record->age); } }