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);