From 235b4eaca05b1231acfd97ff619b4eef72e3a917 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20Vo=C5=99=C3=AD=C5=A1ek?= Date: Tue, 23 Apr 2024 21:23:52 +0200 Subject: [PATCH] allow to use case sensitive regexp matching --- src/Persistence/Sql/Mysql/Query.php | 2 +- src/Persistence/Sql/Oracle/Query.php | 4 ++-- src/Persistence/Sql/Postgresql/Query.php | 4 ++-- src/Persistence/Sql/Query.php | 4 ++-- src/Persistence/Sql/Sqlite/Query.php | 7 ++++--- 5 files changed, 11 insertions(+), 10 deletions(-) diff --git a/src/Persistence/Sql/Mysql/Query.php b/src/Persistence/Sql/Mysql/Query.php index 303ca73bd..9dd32eb96 100644 --- a/src/Persistence/Sql/Mysql/Query.php +++ b/src/Persistence/Sql/Mysql/Query.php @@ -54,7 +54,7 @@ protected function _renderConditionLikeOperator(bool $negated, string $sqlLeft, } #[\Override] - protected function _renderConditionRegexpOperator(bool $negated, string $sqlLeft, string $sqlRight): string + protected function _renderConditionRegexpOperator(bool $negated, string $sqlLeft, string $sqlRight, ?bool $caseSensitive = null): string { $serverVersion = $this->connection->getConnection()->getWrappedConnection()->getServerVersion(); // @phpstan-ignore-line $isMysql5x = str_starts_with($serverVersion, '5.') && !str_contains($serverVersion, 'MariaDB'); diff --git a/src/Persistence/Sql/Oracle/Query.php b/src/Persistence/Sql/Oracle/Query.php index 5d598cbe1..293319cc9 100644 --- a/src/Persistence/Sql/Oracle/Query.php +++ b/src/Persistence/Sql/Oracle/Query.php @@ -18,10 +18,10 @@ class Query extends BaseQuery protected string $expressionClass = Expression::class; #[\Override] - protected function _renderConditionRegexpOperator(bool $negated, string $sqlLeft, string $sqlRight): string + protected function _renderConditionRegexpOperator(bool $negated, string $sqlLeft, string $sqlRight, ?bool $caseSensitive = null): string { return ($negated ? 'not ' : '') . 'regexp_like(' . $sqlLeft . ', ' . $sqlRight - . ', ' . $this->escapeStringLiteral('in') . ')'; + . ', ' . $this->escapeStringLiteral(($caseSensitive ? '' : 'i') . 'n') . ')'; } #[\Override] diff --git a/src/Persistence/Sql/Postgresql/Query.php b/src/Persistence/Sql/Postgresql/Query.php index 809fb363e..2e1b247ad 100644 --- a/src/Persistence/Sql/Postgresql/Query.php +++ b/src/Persistence/Sql/Postgresql/Query.php @@ -33,9 +33,9 @@ protected function _renderConditionLikeOperator(bool $negated, string $sqlLeft, // needed for PostgreSQL v14 and lower #[\Override] - protected function _renderConditionRegexpOperator(bool $negated, string $sqlLeft, string $sqlRight): string + protected function _renderConditionRegexpOperator(bool $negated, string $sqlLeft, string $sqlRight, ?bool $caseSensitive = null): string { - return $sqlLeft . ' ' . ($negated ? '!' : '') . '~* ' . $sqlRight; + return $sqlLeft . ' ' . ($negated ? '!' : '') . '~' . ($caseSensitive ? '' : '*') . ' ' . $sqlRight; } #[\Override] diff --git a/src/Persistence/Sql/Query.php b/src/Persistence/Sql/Query.php index 15b1f42c7..0dba0b83a 100644 --- a/src/Persistence/Sql/Query.php +++ b/src/Persistence/Sql/Query.php @@ -572,10 +572,10 @@ protected function _renderConditionLikeOperator(bool $negated, string $sqlLeft, . ' escape ' . $this->escapeStringLiteral('\\'); } - protected function _renderConditionRegexpOperator(bool $negated, string $sqlLeft, string $sqlRight): string + protected function _renderConditionRegexpOperator(bool $negated, string $sqlLeft, string $sqlRight, ?bool $caseSensitive = null): string { return ($negated ? 'not ' : '') . 'regexp_like(' . $sqlLeft . ', ' . $sqlRight - . ', ' . $this->escapeStringLiteral('is') . ')'; + . ', ' . $this->escapeStringLiteral(($caseSensitive ? '' : 'i') . 's') . ')'; } /** diff --git a/src/Persistence/Sql/Sqlite/Query.php b/src/Persistence/Sql/Sqlite/Query.php index c1c5ded8f..b6c969750 100644 --- a/src/Persistence/Sql/Sqlite/Query.php +++ b/src/Persistence/Sql/Sqlite/Query.php @@ -113,7 +113,7 @@ function ($sqlLeft, $sqlRight) { $res = '(' . parent::_renderConditionLikeOperator(false, $sqlLeft, $sqlRight) . ' and ((' . $sqlLeft . ' = lower(' . $sqlLeft . ') and ' . $sqlLeft . ' = upper(' . $sqlLeft . '))' - . ' or ' . preg_replace('~(?<=\')i(?=s\'\)$)~', '', $this->_renderConditionRegexpOperator( + . ' or ' . $this->_renderConditionRegexpOperator( false, $sqlLeft, 'concat(' . $this->escapeStringLiteral('^') . ',' . $regexReplaceSqlFx( @@ -128,8 +128,9 @@ function ($sqlLeft, $sqlRight) { ), '(?escapeStringLiteral('$') . ')' - )) . '))'; + ) . ', ' . $this->escapeStringLiteral('$') . ')', + true + ) . '))'; return $res; }