From e96ef726fe00a61282d4b9bece54be64aa8c49f6 Mon Sep 17 00:00:00 2001 From: Richard Fath Date: Sat, 16 Mar 2024 14:06:31 +0100 Subject: [PATCH 1/3] Use row_number window function on MariaDB >= 11.0 --- src/Query/MysqlQueryBuilder.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/Query/MysqlQueryBuilder.php b/src/Query/MysqlQueryBuilder.php index ef106a7a..23b7f654 100644 --- a/src/Query/MysqlQueryBuilder.php +++ b/src/Query/MysqlQueryBuilder.php @@ -215,6 +215,10 @@ public function selectRowNumber($orderBy, $orderColumnAlias) { $this->validateRowNumber($orderBy, $orderColumnAlias); + if ($this->db->isMariaDb() && version_compare($this->db->getVersion(), '11.0.0', '>=')) { + return $this->select("ROW_NUMBER() OVER (ORDER BY $orderBy) AS $orderColumnAlias"); + } + return $this->select("(SELECT @rownum := @rownum + 1 FROM (SELECT @rownum := 0) AS r) AS $orderColumnAlias"); } From 2941bde9d0d6091cee79e4442e3e04e0ea6342bf Mon Sep 17 00:00:00 2001 From: Richard Fath Date: Sat, 16 Mar 2024 17:11:19 +0100 Subject: [PATCH 2/3] Use parent class method --- src/Query/MysqlQueryBuilder.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Query/MysqlQueryBuilder.php b/src/Query/MysqlQueryBuilder.php index 23b7f654..b6df5edc 100644 --- a/src/Query/MysqlQueryBuilder.php +++ b/src/Query/MysqlQueryBuilder.php @@ -213,12 +213,12 @@ public function findInSet($value, $set) */ public function selectRowNumber($orderBy, $orderColumnAlias) { - $this->validateRowNumber($orderBy, $orderColumnAlias); - if ($this->db->isMariaDb() && version_compare($this->db->getVersion(), '11.0.0', '>=')) { - return $this->select("ROW_NUMBER() OVER (ORDER BY $orderBy) AS $orderColumnAlias"); + return parent::selectRowNumber($orderBy, $orderColumnAlias); } + $this->validateRowNumber($orderBy, $orderColumnAlias); + return $this->select("(SELECT @rownum := @rownum + 1 FROM (SELECT @rownum := 0) AS r) AS $orderColumnAlias"); } From d9a899e83d8d93f9684e8a33e41c621c22f36953 Mon Sep 17 00:00:00 2001 From: Richard Fath Date: Sun, 17 Mar 2024 11:27:01 +0100 Subject: [PATCH 3/3] Add comments --- src/Query/MysqlQueryBuilder.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/Query/MysqlQueryBuilder.php b/src/Query/MysqlQueryBuilder.php index b6df5edc..5dc69a78 100644 --- a/src/Query/MysqlQueryBuilder.php +++ b/src/Query/MysqlQueryBuilder.php @@ -210,9 +210,14 @@ public function findInSet($value, $set) * * @since 2.0.0 * @throws \RuntimeException + * + * @todo Remove this method when the database version requirements have been raised + * to >= 8.0.0 for MySQL and >= 10.2.0 for MariaDB so the ROW_NUMBER() window + * function can be used in any case. */ public function selectRowNumber($orderBy, $orderColumnAlias) { + // Use parent method with ROW_NUMBER() window function on MariaDB 11.0.0 and newer. if ($this->db->isMariaDb() && version_compare($this->db->getVersion(), '11.0.0', '>=')) { return parent::selectRowNumber($orderBy, $orderColumnAlias); }