From 1b0441cd360692a80ade508a715cf55d5715048b Mon Sep 17 00:00:00 2001 From: Mattijs Date: Wed, 15 Jul 2026 21:54:17 +0200 Subject: [PATCH] =?UTF-8?q?User=20defined=20REVERSE()=20function=20Unicode?= =?UTF-8?q?=20support=20=F0=9F=8E=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../class-wp-sqlite-pdo-user-defined-functions.php | 13 +++++++++---- .../tests/WP_MySQL_On_SQLite_Tests.php | 8 ++++++++ 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/packages/mysql-on-sqlite/src/sqlite/class-wp-sqlite-pdo-user-defined-functions.php b/packages/mysql-on-sqlite/src/sqlite/class-wp-sqlite-pdo-user-defined-functions.php index 970c1f925..785deea08 100644 --- a/packages/mysql-on-sqlite/src/sqlite/class-wp-sqlite-pdo-user-defined-functions.php +++ b/packages/mysql-on-sqlite/src/sqlite/class-wp-sqlite-pdo-user-defined-functions.php @@ -934,15 +934,20 @@ public function version() { * Method to emulate MySQL REVERSE() function. * * Takes a string and returns the reverse of it. + * Compatible with MySQL behaviour for utf8mb4 strings. * - * @param string|null $str The string to reverse. - * - * @return string|null reversed string, or NULL. - */ + * @param string|null $str The string to reverse. + * + * @return string|null reversed string, or NULL. + */ public function reverse( $str ) { if ( null === $str ) { return null; } + if ( preg_match( '/[^\x00-\x7F]/', $str ) ) { + preg_match_all( '/./u', $str, $matches ); + return implode( '', array_reverse( $matches[0] ) ); + } return strrev( $str ); } diff --git a/packages/mysql-on-sqlite/tests/WP_MySQL_On_SQLite_Tests.php b/packages/mysql-on-sqlite/tests/WP_MySQL_On_SQLite_Tests.php index 62aefbb89..2b6477280 100644 --- a/packages/mysql-on-sqlite/tests/WP_MySQL_On_SQLite_Tests.php +++ b/packages/mysql-on-sqlite/tests/WP_MySQL_On_SQLite_Tests.php @@ -12585,6 +12585,14 @@ public function testReverseFunction(): void { $result = $this->assertQuery( "SELECT REVERSE('aoeuidhtns') AS reversed" ); $this->assertSame( 'snthdiueoa', $result[0]->reversed ); + // Unicode reverse. + $result = $this->assertQuery( "SELECT REVERSE('Héllö Wörld!') AS reversed" ); + $this->assertSame( '!dlröW ölléH', $result[0]->reversed ); + + // Emoji reverse. + $result = $this->assertQuery( "SELECT REVERSE('Text with 😁😂🤣 emoji 🚀') AS reversed" ); + $this->assertSame( '🚀 ijome 🤣😂😁 htiw txeT', $result[0]->reversed ); + // Empty string. $result = $this->assertQuery( "SELECT REVERSE('') AS reversed" ); $this->assertSame( '', $result[0]->reversed );