1
0
mirror of https://github.com/MariaDB/server.git synced 2025-04-17 10:37:22 +03:00

MDEV-36087 Check for existence of the new Options JSON field in mysql.servers

This fixes server startup segv introduced in MDEV-34716
d2eba35653b87a8fbd3bffe3ac4b4eb0ab7c0ca9 when upgrading from server
versions lower than 11.7.

Also construct the JSON Options column when upgrading from a version
without the column.
This commit is contained in:
Yuchen Pei 2025-02-17 13:43:22 +11:00
parent b453123a26
commit 6f1161aa34
No known key found for this signature in database
GPG Key ID: 3DD1B35105743563
2 changed files with 11 additions and 1 deletions

View File

@ -903,8 +903,18 @@ ALTER TABLE servers
MODIFY Socket char(108) NOT NULL DEFAULT '';
# MDEV-34716 Allow arbitrary options in CREATE SERVER
# Check existence of the Options column
SET @hadOptions:=0;
SELECT @hadOptions:=1 FROM servers WHERE options IS NOT NULL;
ALTER TABLE servers
ADD Options JSON NOT NULL DEFAULT '{}' CHECK(JSON_VALID(Options));
# Ensure the collation is utf8mb4_bin (default for JSON)
ALTER TABLE servers
MODIFY Options JSON NOT NULL DEFAULT '{}' CHECK(JSON_VALID(Options));
# If the Options column did not exist, convert to the Options
UPDATE servers SET Options = JSON_INSERT(Options, '$.host', Host) WHERE Host <> '' AND @hadOptions = 0;
UPDATE servers SET Options = JSON_INSERT(Options, '$.database', Db) WHERE Db <> '' AND @hadOptions = 0;
UPDATE servers SET Options = JSON_INSERT(Options, '$.username', Username) WHERE Username <> '' AND @hadOptions = 0;
UPDATE servers SET Options = JSON_INSERT(Options, '$.port', CAST(Port AS VARCHAR(5))) WHERE @hadOptions = 0;
UPDATE servers SET Options = JSON_INSERT(Options, '$.socket', Socket) WHERE Socket <> '' AND @hadOptions = 0;
UPDATE servers SET Options = JSON_INSERT(Options, '$.owner', Owner) WHERE Owner <> '' AND @hadOptions = 0;

View File

@ -473,7 +473,7 @@ get_server_from_table_to_cache(TABLE *table)
server->scheme= ptr ? ptr : blank;
ptr= get_field(&mem, table->field[8]);
server->owner= ptr ? ptr : blank;
ptr= get_field(&mem, table->field[9]);
ptr= table->field[9] ? get_field(&mem, table->field[9]) : NULL;
server->option_list= NULL;
if (ptr && parse_server_options_json(server, ptr))
DBUG_RETURN(TRUE);