Skip to content

Commit 8caf468

Browse files
committed
Revert "MySqlDriver driver uses subqueries (#265)"
This reverts commit e89a34a. "MySQL does not support LIMIT in subqueries for certain subquery operators" dev.mysql.com/doc/refman/8.0/en/subquery-restrictions.html
1 parent 3cc79b1 commit 8caf468

2 files changed

Lines changed: 14 additions & 11 deletions

File tree

src/Database/Drivers/MySqlDriver.php

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,6 @@ class MySqlDriver implements Nette\Database\Driver
2727
/** @var Nette\Database\Connection */
2828
private $connection;
2929

30-
/** @var string */
31-
private $version;
32-
3330

3431
/**
3532
* Driver options:
@@ -39,8 +36,8 @@ class MySqlDriver implements Nette\Database\Driver
3936
public function initialize(Nette\Database\Connection $connection, array $options): void
4037
{
4138
$this->connection = $connection;
42-
$this->version = $connection->getPdo()->getAttribute(\PDO::ATTR_SERVER_VERSION);
43-
$charset = $options['charset'] ?? (version_compare($this->version, '5.5.3', '>=') ? 'utf8mb4' : 'utf8');
39+
$charset = $options['charset']
40+
?? (version_compare($connection->getPdo()->getAttribute(\PDO::ATTR_SERVER_VERSION), '5.5.3', '>=') ? 'utf8mb4' : 'utf8');
4441
if ($charset) {
4542
$connection->query('SET NAMES ?', $charset);
4643
}
@@ -206,10 +203,7 @@ public function isSupported(string $item): bool
206203
// MULTI_COLUMN_AS_OR_COND due to mysql bugs:
207204
// - http://bugs.mysql.com/bug.php?id=31188
208205
// - http://bugs.mysql.com/bug.php?id=35819
209-
// SUPPORT_SUBSELECT is slow before 5.7
210-
// - http://mysqlserverteam.com/derived-tables-in-mysql-5-7/
211-
return $item === self::SUPPORT_SELECT_UNGROUPED_COLUMNS
212-
|| $item === self::SUPPORT_MULTI_COLUMN_AS_OR_COND
213-
|| ($item === self::SUPPORT_SUBSELECT && version_compare($this->version, '5.7', '>='));
206+
// and more.
207+
return $item === self::SUPPORT_SELECT_UNGROUPED_COLUMNS || $item === self::SUPPORT_MULTI_COLUMN_AS_OR_COND;
214208
}
215209
}

tests/Database/Table/SqlBuilder.addWhere().phpt

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,10 @@ test('?name', function () use ($explorer) {
3838
test('test Selection as a parameter', function () use ($explorer) {
3939
$sqlBuilder = new SqlBuilder('book', $explorer);
4040
$sqlBuilder->addWhere('id', $explorer->table('book'));
41-
Assert::equal(reformat(['SELECT * FROM [book] WHERE ([id] IN (SELECT [id] FROM [book]))']), $sqlBuilder->buildSelectQuery());
41+
Assert::equal(reformat([
42+
'mysql' => 'SELECT * FROM `book` WHERE (`id` IN (?))',
43+
'SELECT * FROM [book] WHERE ([id] IN (SELECT [id] FROM [book]))',
44+
]), $sqlBuilder->buildSelectQuery());
4245
});
4346

4447

@@ -47,6 +50,7 @@ test('test more Selection as a parameter', function () use ($explorer) {
4750
$sqlBuilder->addWhere('id', $explorer->table('book'));
4851
$sqlBuilder->addWhere('id', $explorer->table('book_tag')->select('book_id'));
4952
Assert::equal(reformat([
53+
'mysql' => 'SELECT * FROM `book` WHERE (`id` IN (?)) AND (`id` IN (?))',
5054
'SELECT * FROM [book] WHERE ([id] IN (SELECT [id] FROM [book])) AND ([id] IN (SELECT [book_id] FROM [book_tag]))',
5155
]), $sqlBuilder->buildSelectQuery());
5256
});
@@ -56,6 +60,7 @@ test('test more Selection as one of more argument', function () use ($explorer)
5660
$sqlBuilder = new SqlBuilder('book', $explorer);
5761
$sqlBuilder->addWhere('id ? AND id ?', $explorer->table('book')->where('id', 2), $explorer->table('book_tag')->select('book_id'));
5862
Assert::equal(reformat([
63+
'mysql' => 'SELECT * FROM `book` WHERE (`id` IN (?) AND `id` IN (?))',
5964
'SELECT * FROM [book] WHERE ([id] IN (SELECT [id] FROM [book] WHERE ([id] = ?)) AND [id] IN (SELECT [book_id] FROM [book_tag]))',
6065
]), $sqlBuilder->buildSelectQuery());
6166
});
@@ -77,6 +82,7 @@ test('test Selection with parameters as a parameter', function () use ($explorer
7782
$sqlBuilder->addWhere('id', $explorer->table('book')->having('COUNT(:book_tag.tag_id) >', 1));
7883
$schemaSupported = $explorer->getConnection()->getDriver()->isSupported(Driver::SUPPORT_SCHEMA);
7984
Assert::equal(reformat([
85+
'mysql' => 'SELECT * FROM `book` WHERE (`id` IN (?))',
8086
'SELECT * FROM [book] WHERE ([id] IN (SELECT [id] FROM [book] LEFT JOIN ' . ($schemaSupported ? '[public].[book_tag] ' : '') . '[book_tag] ON [book].[id] = [book_tag].[book_id] HAVING COUNT([book_tag].[tag_id]) > ?))',
8187
]), $sqlBuilder->buildSelectQuery());
8288
Assert::count(1, $sqlBuilder->getParameters());
@@ -87,6 +93,7 @@ test('test Selection with column as a parameter', function () use ($explorer) {
8793
$sqlBuilder = new SqlBuilder('book', $explorer);
8894
$sqlBuilder->addWhere('id', $explorer->table('book')->select('id'));
8995
Assert::equal(reformat([
96+
'mysql' => 'SELECT * FROM `book` WHERE (`id` IN (?))',
9097
'SELECT * FROM [book] WHERE ([id] IN (SELECT [id] FROM [book]))',
9198
]), $sqlBuilder->buildSelectQuery());
9299
});
@@ -96,6 +103,7 @@ test('test multiple placeholder parameter', function () use ($explorer) {
96103
$sqlBuilder = new SqlBuilder('book', $explorer);
97104
$sqlBuilder->addWhere('id ? OR id ?', null, $explorer->table('book'));
98105
Assert::equal(reformat([
106+
'mysql' => 'SELECT * FROM `book` WHERE (`id` IS NULL OR `id` IN (?))',
99107
'SELECT * FROM [book] WHERE ([id] IS NULL OR [id] IN (SELECT [id] FROM [book]))',
100108
]), $sqlBuilder->buildSelectQuery());
101109
});
@@ -168,6 +176,7 @@ test('tests NOT', function () use ($explorer) {
168176
$sqlBuilder->addWhere('id NOT', null);
169177
$sqlBuilder->addWhere('id NOT', $explorer->table('book')->select('id'));
170178
Assert::equal(reformat([
179+
'mysql' => 'SELECT * FROM `book` WHERE (`id` NOT IN (?)) AND (`id` IS NOT NULL) AND (`id` NOT IN (?))',
171180
'SELECT * FROM [book] WHERE ([id] NOT IN (?)) AND ([id] IS NOT NULL) AND ([id] NOT IN (SELECT [id] FROM [book]))',
172181
]), $sqlBuilder->buildSelectQuery());
173182
});

0 commit comments

Comments
 (0)