From 656ff76a8d094d992600c040afc30654b42ab1ae Mon Sep 17 00:00:00 2001 From: Yuri Kuznetsov Date: Wed, 1 Mar 2023 13:04:50 +0200 Subject: [PATCH] lock alias mysql --- .../ORM/QueryComposer/MysqlQueryComposer.php | 11 ++++++++++- tests/unit/Espo/ORM/MysqlQueryComposerTest.php | 18 +++++++++++++++++- 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/application/Espo/ORM/QueryComposer/MysqlQueryComposer.php b/application/Espo/ORM/QueryComposer/MysqlQueryComposer.php index ac59a4cee7..104f6dcab9 100644 --- a/application/Espo/ORM/QueryComposer/MysqlQueryComposer.php +++ b/application/Espo/ORM/QueryComposer/MysqlQueryComposer.php @@ -39,7 +39,9 @@ class MysqlQueryComposer extends BaseQueryComposer { $params = $query->getRaw(); - $table = $this->toDb($this->sanitize($params['table'])); + $entityType = $this->sanitize($params['table']); + + $table = $this->toDb($entityType); $mode = $params['mode']; @@ -60,6 +62,13 @@ class MysqlQueryComposer extends BaseQueryComposer $sql .= $modeMap[$mode]; + if (str_contains($table, '_')) { + // MySQL has an issue that aliased tables must be locked with alias. + $sql .= ", " . + $this->quoteIdentifier($table) . " AS " . + $this->quoteIdentifier(lcfirst($entityType)) . " " . $modeMap[$mode]; + } + return $sql; } diff --git a/tests/unit/Espo/ORM/MysqlQueryComposerTest.php b/tests/unit/Espo/ORM/MysqlQueryComposerTest.php index 9ca0472710..0a0e1bffe9 100644 --- a/tests/unit/Espo/ORM/MysqlQueryComposerTest.php +++ b/tests/unit/Espo/ORM/MysqlQueryComposerTest.php @@ -2668,7 +2668,7 @@ class MysqlQueryComposerTest extends \PHPUnit\Framework\TestCase $this->assertEquals($expectedSql, $sql); } - public function testLockTableExclusive() + public function testLockTableExclusive1() { $builder = new LockTableBuilder(); @@ -2684,6 +2684,22 @@ class MysqlQueryComposerTest extends \PHPUnit\Framework\TestCase $this->assertEquals($expectedSql, $sql); } + public function testLockTableExclusive2() + { + $builder = new LockTableBuilder(); + + $query = $builder + ->table('EntityTeam') + ->inExclusiveMode() + ->build(); + + $sql = $this->query->compose($query); + + $expectedSql = "LOCK TABLES `entity_team` WRITE, `entity_team` AS `entityTeam` WRITE"; + + $this->assertEquals($expectedSql, $sql); + } + public function testFunctionConverter1(): void { $functionConverter = $this->createMock(FunctionConverter::class);