Skip to content

Commit 6f1161a

Browse files
MDEV-36087 Check for existence of the new Options JSON field in mysql.servers
This fixes server startup segv introduced in MDEV-34716 d2eba35 when upgrading from server versions lower than 11.7. Also construct the JSON Options column when upgrading from a version without the column.
1 parent b453123 commit 6f1161a

File tree

2 files changed

+11
-1
lines changed

2 files changed

+11
-1
lines changed

scripts/mariadb_system_tables_fix.sql

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -903,8 +903,18 @@ ALTER TABLE servers
903903
MODIFY Socket char(108) NOT NULL DEFAULT '';
904904

905905
# MDEV-34716 Allow arbitrary options in CREATE SERVER
906+
# Check existence of the Options column
907+
SET @hadOptions:=0;
908+
SELECT @hadOptions:=1 FROM servers WHERE options IS NOT NULL;
906909
ALTER TABLE servers
907910
ADD Options JSON NOT NULL DEFAULT '{}' CHECK(JSON_VALID(Options));
908911
# Ensure the collation is utf8mb4_bin (default for JSON)
909912
ALTER TABLE servers
910913
MODIFY Options JSON NOT NULL DEFAULT '{}' CHECK(JSON_VALID(Options));
914+
# If the Options column did not exist, convert to the Options
915+
UPDATE servers SET Options = JSON_INSERT(Options, '$.host', Host) WHERE Host <> '' AND @hadOptions = 0;
916+
UPDATE servers SET Options = JSON_INSERT(Options, '$.database', Db) WHERE Db <> '' AND @hadOptions = 0;
917+
UPDATE servers SET Options = JSON_INSERT(Options, '$.username', Username) WHERE Username <> '' AND @hadOptions = 0;
918+
UPDATE servers SET Options = JSON_INSERT(Options, '$.port', CAST(Port AS VARCHAR(5))) WHERE @hadOptions = 0;
919+
UPDATE servers SET Options = JSON_INSERT(Options, '$.socket', Socket) WHERE Socket <> '' AND @hadOptions = 0;
920+
UPDATE servers SET Options = JSON_INSERT(Options, '$.owner', Owner) WHERE Owner <> '' AND @hadOptions = 0;

sql/sql_servers.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -473,7 +473,7 @@ get_server_from_table_to_cache(TABLE *table)
473473
server->scheme= ptr ? ptr : blank;
474474
ptr= get_field(&mem, table->field[8]);
475475
server->owner= ptr ? ptr : blank;
476-
ptr= get_field(&mem, table->field[9]);
476+
ptr= table->field[9] ? get_field(&mem, table->field[9]) : NULL;
477477
server->option_list= NULL;
478478
if (ptr && parse_server_options_json(server, ptr))
479479
DBUG_RETURN(TRUE);

0 commit comments

Comments
 (0)