From 6f1161aa34cbb178b00fc24cbc46e2e0e2af767a Mon Sep 17 00:00:00 2001 From: Yuchen Pei Date: Mon, 17 Feb 2025 13:43:22 +1100 Subject: [PATCH] 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. --- scripts/mariadb_system_tables_fix.sql | 10 ++++++++++ sql/sql_servers.cc | 2 +- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/scripts/mariadb_system_tables_fix.sql b/scripts/mariadb_system_tables_fix.sql index bbed5089383..16ce0775d3b 100644 --- a/scripts/mariadb_system_tables_fix.sql +++ b/scripts/mariadb_system_tables_fix.sql @@ -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; diff --git a/sql/sql_servers.cc b/sql/sql_servers.cc index e49eb573d99..9563022632e 100644 --- a/sql/sql_servers.cc +++ b/sql/sql_servers.cc @@ -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);