diff options
Diffstat (limited to 'sql/set_var.cc')
-rw-r--r-- | sql/set_var.cc | 24 |
1 files changed, 15 insertions, 9 deletions
diff --git a/sql/set_var.cc b/sql/set_var.cc index 9744f0f6f39..067abcb049e 100644 --- a/sql/set_var.cc +++ b/sql/set_var.cc @@ -533,7 +533,6 @@ static my_old_conv old_conv[]= CHARSET_INFO *get_old_charset_by_name(const char *name) { my_old_conv *conv; - for (conv= old_conv; conv->old_name; conv++) { if (!my_strcasecmp(&my_charset_latin1, name, conv->old_name)) @@ -826,15 +825,20 @@ int set_var::check(THD *thd) */ int set_var::light_check(THD *thd) { + if (var->is_readonly()) + { + my_error(ER_INCORRECT_GLOBAL_LOCAL_VAR, MYF(0), var->name.str, "read only"); + return -1; + } if (var->check_type(type)) { int err= type == OPT_GLOBAL ? ER_LOCAL_VARIABLE : ER_GLOBAL_VARIABLE; my_error(err, MYF(0), var->name.str); return -1; } - if (type == OPT_GLOBAL && - check_global_access(thd, PRIV_SET_GLOBAL_SYSTEM_VARIABLE)) - return 1; + + if (type == OPT_GLOBAL && var->on_check_access_global(thd)) + return 1; if (value && value->fix_fields_if_needed_for_scalar(thd, &value)) return -1; @@ -1034,7 +1038,7 @@ int set_var_collation_client::check(THD *thd) if (!is_supported_parser_charset(character_set_client)) { my_error(ER_WRONG_VALUE_FOR_VAR, MYF(0), "character_set_client", - character_set_client->csname); + character_set_client->cs_name.str); return 1; } return 0; @@ -1089,7 +1093,7 @@ int fill_sysvars(THD *thd, TABLE_LIST *tables, COND *cond) StringBuffer<STRING_BUFFER_USUAL_SIZE> strbuf(scs); const char *wild= thd->lex->wild ? thd->lex->wild->ptr() : 0; Field **fields=tables->table->field; - bool has_file_acl= !check_access(thd, FILE_ACL, any_db, NULL, NULL, 0, 1); + bool has_file_acl= !check_access(thd, FILE_ACL, any_db.str, NULL,NULL,0,1); DBUG_ASSERT(tables->table->in_use == thd); @@ -1219,12 +1223,14 @@ int fill_sysvars(THD *thd, TABLE_LIST *tables, COND *cond) { uint i; strbuf.length(0); - for (i=0; i + 1 < tl->count; i++) + for (i=0; i < tl->count; i++) { - strbuf.append(tl->type_names[i]); + const char *name= tl->type_names[i]; + strbuf.append(name, strlen(name)); strbuf.append(','); } - strbuf.append(tl->type_names[i]); + if (!strbuf.is_empty()) + strbuf.chop(); fields[11]->set_notnull(); fields[11]->store(strbuf.ptr(), strbuf.length(), scs); } |