summaryrefslogtreecommitdiffstats
path: root/debian/patches/MDEV-32975-chartset-collation-fix-php.patch
diff options
context:
space:
mode:
Diffstat (limited to 'debian/patches/MDEV-32975-chartset-collation-fix-php.patch')
-rw-r--r--debian/patches/MDEV-32975-chartset-collation-fix-php.patch45
1 files changed, 45 insertions, 0 deletions
diff --git a/debian/patches/MDEV-32975-chartset-collation-fix-php.patch b/debian/patches/MDEV-32975-chartset-collation-fix-php.patch
new file mode 100644
index 00000000..4fa54955
--- /dev/null
+++ b/debian/patches/MDEV-32975-chartset-collation-fix-php.patch
@@ -0,0 +1,45 @@
+Origin: https://github.com/MariaDB/server/commit/1b37cb71f44549c94acf8914cf93d43a4293a449
+Bug: https://jira.mariadb.org/browse/MDEV-32975
+From: Alexander Barkov <bar@mariadb.com>
+Date: Fri, 26 Jan 2024 13:12:03 +0400
+Subject: [PATCH] MDEV-32975 Default charset doesn't work with PHP MySQLi
+ extension
+
+When sending the server default collation ID to the client
+in the handshake packet, translate a 2-byte collation ID
+to the ID of the default collation for the character set.
+---
+ sql/sql_acl.cc | 21 ++++++++++++++++++++-
+ 1 file changed, 20 insertions(+), 1 deletion(-)
+
+--- a/sql/sql_acl.cc
++++ b/sql/sql_acl.cc
+@@ -13354,8 +13354,27 @@ static bool send_server_handshake_packet
+ *end++= 0;
+
+ int2store(end, thd->client_capabilities);
++
++ CHARSET_INFO *handshake_cs= default_charset_info;
++ if (handshake_cs->number > 0xFF)
++ {
++ /*
++ A workaround for a 2-byte collation ID: translate it into
++ the ID of the primary collation of this character set.
++ */
++ CHARSET_INFO *cs= get_charset_by_csname(handshake_cs->cs_name.str,
++ MY_CS_PRIMARY, MYF(MY_WME));
++ /*
++ cs should not normally be NULL, however it may be possible
++ with a dynamic character set incorrectly defined in Index.xml.
++ For safety let's fallback to latin1 in case cs is NULL.
++ */
++ handshake_cs= cs ? cs : &my_charset_latin1;
++ }
++
+ /* write server characteristics: up to 16 bytes allowed */
+- end[2]= (char) default_charset_info->number;
++ end[2]= (char) handshake_cs->number;
++
+ int2store(end+3, mpvio->auth_info.thd->server_status);
+ int2store(end+5, thd->client_capabilities >> 16);
+ end[7]= data_len;