mirror of
https://github.com/MariaDB/server.git
synced 2025-08-01 03:47:19 +03:00
Changing field::field_name and Item::name to LEX_CSTRING
Benefits of this patch: - Removed a lot of calls to strlen(), especially for field_string - Strings generated by parser are now const strings, less chance of accidently changing a string - Removed a lot of calls with LEX_STRING as parameter (changed to pointer) - More uniform code - Item::name_length was not kept up to date. Now fixed - Several bugs found and fixed (Access to null pointers, access of freed memory, wrong arguments to printf like functions) - Removed a lot of casts from (const char*) to (char*) Changes: - This caused some ABI changes - lex_string_set now uses LEX_CSTRING - Some fucntions are now taking const char* instead of char* - Create_field::change and after changed to LEX_CSTRING - handler::connect_string, comment and engine_name() changed to LEX_CSTRING - Checked printf() related calls to find bugs. Found and fixed several errors in old code. - A lot of changes from LEX_STRING to LEX_CSTRING, especially related to parsing and events. - Some changes from LEX_STRING and LEX_STRING & to LEX_CSTRING* - Some changes for char* to const char* - Added printf argument checking for my_snprintf() - Introduced null_clex_str, star_clex_string, temp_lex_str to simplify code - Added item_empty_name and item_used_name to be able to distingush between items that was given an empty name and items that was not given a name This is used in sql_yacc.yy to know when to give an item a name. - select table_name."*' is not anymore same as table_name.* - removed not used function Item::rename() - Added comparision of item->name_length before some calls to my_strcasecmp() to speed up comparison - Moved Item_sp_variable::make_field() from item.h to item.cc - Some minimal code changes to avoid copying to const char * - Fixed wrong error message in wsrep_mysql_parse() - Fixed wrong code in find_field_in_natural_join() where real_item() was set when it shouldn't - ER_ERROR_ON_RENAME was used with extra arguments. - Removed some (wrong) ER_OUTOFMEMORY, as alloc_root will already give the error. TODO: - Check possible unsafe casts in plugin/auth_examples/qa_auth_interface.c - Change code to not modify LEX_CSTRING for database name (as part of lower_case_table_names)
This commit is contained in:
107
sql/sql_base.cc
107
sql/sql_base.cc
@ -502,7 +502,7 @@ err_with_reopen:
|
||||
struct close_cached_connection_tables_arg
|
||||
{
|
||||
THD *thd;
|
||||
LEX_STRING *connection;
|
||||
LEX_CSTRING *connection;
|
||||
TABLE_LIST *tables;
|
||||
};
|
||||
|
||||
@ -547,7 +547,7 @@ end:
|
||||
}
|
||||
|
||||
|
||||
bool close_cached_connection_tables(THD *thd, LEX_STRING *connection)
|
||||
bool close_cached_connection_tables(THD *thd, LEX_CSTRING *connection)
|
||||
{
|
||||
close_cached_connection_tables_arg argument;
|
||||
DBUG_ENTER("close_cached_connections");
|
||||
@ -1481,7 +1481,7 @@ bool open_table(THD *thd, TABLE_LIST *table_list, Open_table_context *ot_ctx)
|
||||
TABLE *table;
|
||||
const char *key;
|
||||
uint key_length;
|
||||
char *alias= table_list->alias;
|
||||
const char *alias= table_list->alias;
|
||||
uint flags= ot_ctx->get_flags();
|
||||
MDL_ticket *mdl_ticket;
|
||||
TABLE_SHARE *share;
|
||||
@ -4174,8 +4174,9 @@ handle_routine(THD *thd, Query_tables_list *prelocking_ctx,
|
||||
@note this can be changed to use a hash, instead of scanning the linked
|
||||
list, if the performance of this function will ever become an issue
|
||||
*/
|
||||
static bool table_already_fk_prelocked(TABLE_LIST *tl, LEX_STRING *db,
|
||||
LEX_STRING *table, thr_lock_type lock_type)
|
||||
static bool table_already_fk_prelocked(TABLE_LIST *tl, LEX_CSTRING *db,
|
||||
LEX_CSTRING *table,
|
||||
thr_lock_type lock_type)
|
||||
{
|
||||
for (; tl; tl= tl->next_global )
|
||||
{
|
||||
@ -5246,7 +5247,7 @@ find_field_in_view(THD *thd, TABLE_LIST *table_list,
|
||||
|
||||
for (; !field_it.end_of_fields(); field_it.next())
|
||||
{
|
||||
if (!my_strcasecmp(system_charset_info, field_it.name(), name))
|
||||
if (!my_strcasecmp(system_charset_info, field_it.name()->str, name))
|
||||
{
|
||||
// in PS use own arena or data will be freed after prepare
|
||||
if (register_tree_change &&
|
||||
@ -5270,7 +5271,7 @@ find_field_in_view(THD *thd, TABLE_LIST *table_list,
|
||||
the replacing item.
|
||||
*/
|
||||
if (*ref && !(*ref)->is_autogenerated_name)
|
||||
item->set_name(thd, (*ref)->name, (*ref)->name_length,
|
||||
item->set_name(thd, (*ref)->name.str, (*ref)->name.length,
|
||||
system_charset_info);
|
||||
if (register_tree_change)
|
||||
thd->change_item_tree(ref, item);
|
||||
@ -5331,7 +5332,7 @@ find_field_in_natural_join(THD *thd, TABLE_LIST *table_ref, const char *name,
|
||||
for (nj_col= NULL, curr_nj_col= field_it++; curr_nj_col;
|
||||
curr_nj_col= field_it++)
|
||||
{
|
||||
if (!my_strcasecmp(system_charset_info, curr_nj_col->name(), name))
|
||||
if (!my_strcasecmp(system_charset_info, curr_nj_col->name()->str, name))
|
||||
{
|
||||
if (nj_col)
|
||||
{
|
||||
@ -5358,15 +5359,10 @@ find_field_in_natural_join(THD *thd, TABLE_LIST *table_ref, const char *name,
|
||||
*ref != NULL means that *ref contains the item that we need to
|
||||
replace. If the item was aliased by the user, set the alias to
|
||||
the replacing item.
|
||||
We need to set alias on both ref itself and on ref real item.
|
||||
*/
|
||||
if (*ref && !(*ref)->is_autogenerated_name)
|
||||
{
|
||||
item->set_name(thd, (*ref)->name, (*ref)->name_length,
|
||||
item->set_name(thd, (*ref)->name.str, (*ref)->name.length,
|
||||
system_charset_info);
|
||||
item->real_item()->set_name(thd, (*ref)->name, (*ref)->name_length,
|
||||
system_charset_info);
|
||||
}
|
||||
if (register_tree_change && arena)
|
||||
thd->restore_active_arena(arena, &backup);
|
||||
|
||||
@ -5403,7 +5399,7 @@ find_field_in_natural_join(THD *thd, TABLE_LIST *table_ref, const char *name,
|
||||
nj_col->table_field->fix_fields(thd, &ref))
|
||||
{
|
||||
DBUG_PRINT("info", ("column '%s' was dropped by the concurrent connection",
|
||||
nj_col->table_field->name));
|
||||
nj_col->table_field->name.str));
|
||||
DBUG_RETURN(NULL);
|
||||
}
|
||||
DBUG_ASSERT(ref == 0); // Should not have changed
|
||||
@ -5451,7 +5447,7 @@ find_field_in_table(THD *thd, TABLE *table, const char *name, uint length,
|
||||
/* We assume here that table->field < NO_CACHED_FIELD_INDEX = UINT_MAX */
|
||||
if (cached_field_index < table->s->fields &&
|
||||
!my_strcasecmp(system_charset_info,
|
||||
table->field[cached_field_index]->field_name, name))
|
||||
table->field[cached_field_index]->field_name.str, name))
|
||||
field_ptr= table->field + cached_field_index;
|
||||
else if (table->s->name_hash.records)
|
||||
{
|
||||
@ -5471,7 +5467,8 @@ find_field_in_table(THD *thd, TABLE *table, const char *name, uint length,
|
||||
if (!(field_ptr= table->field))
|
||||
DBUG_RETURN((Field *)0);
|
||||
for (; *field_ptr; ++field_ptr)
|
||||
if (!my_strcasecmp(system_charset_info, (*field_ptr)->field_name, name))
|
||||
if (!my_strcasecmp(system_charset_info, (*field_ptr)->field_name.str,
|
||||
name))
|
||||
break;
|
||||
}
|
||||
|
||||
@ -5734,7 +5731,8 @@ Field *find_field_in_table_sef(TABLE *table, const char *name)
|
||||
if (!(field_ptr= table->field))
|
||||
return (Field *)0;
|
||||
for (; *field_ptr; ++field_ptr)
|
||||
if (!my_strcasecmp(system_charset_info, (*field_ptr)->field_name, name))
|
||||
if (!my_strcasecmp(system_charset_info, (*field_ptr)->field_name.str,
|
||||
name))
|
||||
break;
|
||||
}
|
||||
if (field_ptr)
|
||||
@ -5787,8 +5785,8 @@ find_field_in_tables(THD *thd, Item_ident *item,
|
||||
Field *found=0;
|
||||
const char *db= item->db_name;
|
||||
const char *table_name= item->table_name;
|
||||
const char *name= item->field_name;
|
||||
uint length=(uint) strlen(name);
|
||||
const char *name= item->field_name.str;
|
||||
uint length= item->field_name.length;
|
||||
char name_buff[SAFE_NAME_LEN+1];
|
||||
TABLE_LIST *cur_table= first_table;
|
||||
TABLE_LIST *actual_table;
|
||||
@ -5835,7 +5833,7 @@ find_field_in_tables(THD *thd, Item_ident *item,
|
||||
#endif
|
||||
}
|
||||
else
|
||||
found= find_field_in_table_ref(thd, table_ref, name, length, item->name,
|
||||
found= find_field_in_table_ref(thd, table_ref, name, length, item->name.str,
|
||||
NULL, NULL, ref, check_privileges,
|
||||
TRUE, &(item->cached_field_index),
|
||||
register_tree_change,
|
||||
@ -5903,7 +5901,7 @@ find_field_in_tables(THD *thd, Item_ident *item,
|
||||
cur_table= cur_table->next_name_resolution_table)
|
||||
{
|
||||
Field *cur_field= find_field_in_table_ref(thd, cur_table, name, length,
|
||||
item->name, db, table_name, ref,
|
||||
item->name.str, db, table_name, ref,
|
||||
(thd->lex->sql_command ==
|
||||
SQLCOM_SHOW_FIELDS)
|
||||
? false : check_privileges,
|
||||
@ -5920,7 +5918,7 @@ find_field_in_tables(THD *thd, Item_ident *item,
|
||||
|
||||
thd->clear_error();
|
||||
cur_field= find_field_in_table_ref(thd, cur_table, name, length,
|
||||
item->name, db, table_name, ref,
|
||||
item->name.str, db, table_name, ref,
|
||||
false,
|
||||
allow_rowid,
|
||||
&(item->cached_field_index),
|
||||
@ -5929,7 +5927,7 @@ find_field_in_tables(THD *thd, Item_ident *item,
|
||||
if (cur_field)
|
||||
{
|
||||
Field *nf=new Field_null(NULL,0,Field::NONE,
|
||||
cur_field->field_name,
|
||||
&cur_field->field_name,
|
||||
&my_charset_bin);
|
||||
nf->init(cur_table->table);
|
||||
cur_field= nf;
|
||||
@ -6045,7 +6043,7 @@ find_item_in_list(Item *find, List<Item> &items, uint *counter,
|
||||
uint n_items= limit == 0 ? items.elements : limit;
|
||||
Item **found=0, **found_unaliased= 0, *item;
|
||||
const char *db_name=0;
|
||||
const char *field_name=0;
|
||||
const LEX_CSTRING *field_name= 0;
|
||||
const char *table_name=0;
|
||||
bool found_unaliased_non_uniq= 0;
|
||||
/*
|
||||
@ -6061,7 +6059,7 @@ find_item_in_list(Item *find, List<Item> &items, uint *counter,
|
||||
find->type() == Item::REF_ITEM);
|
||||
if (is_ref_by_name)
|
||||
{
|
||||
field_name= ((Item_ident*) find)->field_name;
|
||||
field_name= &((Item_ident*) find)->field_name;
|
||||
table_name= ((Item_ident*) find)->table_name;
|
||||
db_name= ((Item_ident*) find)->db_name;
|
||||
}
|
||||
@ -6069,7 +6067,7 @@ find_item_in_list(Item *find, List<Item> &items, uint *counter,
|
||||
for (uint i= 0; i < n_items; i++)
|
||||
{
|
||||
item= li++;
|
||||
if (field_name &&
|
||||
if (field_name && field_name->str &&
|
||||
(item->real_item()->type() == Item::FIELD_ITEM ||
|
||||
((item->type() == Item::REF_ITEM) &&
|
||||
(((Item_ref *)item)->ref_type() == Item_ref::VIEW_REF))))
|
||||
@ -6082,7 +6080,7 @@ find_item_in_list(Item *find, List<Item> &items, uint *counter,
|
||||
(if this field created from expression argument of group_concat()),
|
||||
=> we have to check presence of name before compare
|
||||
*/
|
||||
if (!item_field->name)
|
||||
if (!item_field->name.str)
|
||||
continue;
|
||||
|
||||
if (table_name)
|
||||
@ -6103,9 +6101,9 @@ find_item_in_list(Item *find, List<Item> &items, uint *counter,
|
||||
item_field->field_name and item_field->table_name can be 0x0 if
|
||||
item is not fix_field()'ed yet.
|
||||
*/
|
||||
if (item_field->field_name && item_field->table_name &&
|
||||
!my_strcasecmp(system_charset_info, item_field->field_name,
|
||||
field_name) &&
|
||||
if (item_field->field_name.str && item_field->table_name &&
|
||||
!my_strcasecmp(system_charset_info, item_field->field_name.str,
|
||||
field_name->str) &&
|
||||
!my_strcasecmp(table_alias_charset, item_field->table_name,
|
||||
table_name) &&
|
||||
(!db_name || (item_field->db_name &&
|
||||
@ -6135,10 +6133,10 @@ find_item_in_list(Item *find, List<Item> &items, uint *counter,
|
||||
else
|
||||
{
|
||||
int fname_cmp= my_strcasecmp(system_charset_info,
|
||||
item_field->field_name,
|
||||
field_name);
|
||||
item_field->field_name.str,
|
||||
field_name->str);
|
||||
if (!my_strcasecmp(system_charset_info,
|
||||
item_field->name,field_name))
|
||||
item_field->name.str,field_name->str))
|
||||
{
|
||||
/*
|
||||
If table name was not given we should scan through aliases
|
||||
@ -6182,8 +6180,9 @@ find_item_in_list(Item *find, List<Item> &items, uint *counter,
|
||||
}
|
||||
else if (!table_name)
|
||||
{
|
||||
if (is_ref_by_name && find->name && item->name &&
|
||||
!my_strcasecmp(system_charset_info,item->name,find->name))
|
||||
if (is_ref_by_name && find->name.str && item->name.str &&
|
||||
find->name.length == item->name.length &&
|
||||
!my_strcasecmp(system_charset_info,item->name.str, find->name.str))
|
||||
{
|
||||
found= li.ref();
|
||||
*counter= i;
|
||||
@ -6357,17 +6356,17 @@ mark_common_columns(THD *thd, TABLE_LIST *table_ref_1, TABLE_LIST *table_ref_2,
|
||||
for (it_1.set(table_ref_1); !it_1.end_of_fields(); it_1.next())
|
||||
{
|
||||
bool found= FALSE;
|
||||
const char *field_name_1;
|
||||
const LEX_CSTRING *field_name_1;
|
||||
/* true if field_name_1 is a member of using_fields */
|
||||
bool is_using_column_1;
|
||||
if (!(nj_col_1= it_1.get_or_create_column_ref(thd, leaf_1)))
|
||||
goto err;
|
||||
field_name_1= nj_col_1->name();
|
||||
is_using_column_1= using_fields &&
|
||||
test_if_string_in_list(field_name_1, using_fields);
|
||||
test_if_string_in_list(field_name_1->str, using_fields);
|
||||
DBUG_PRINT ("info", ("field_name_1=%s.%s",
|
||||
nj_col_1->table_name() ? nj_col_1->table_name() : "",
|
||||
field_name_1));
|
||||
field_name_1->str));
|
||||
|
||||
/*
|
||||
Find a field with the same name in table_ref_2.
|
||||
@ -6380,14 +6379,14 @@ mark_common_columns(THD *thd, TABLE_LIST *table_ref_1, TABLE_LIST *table_ref_2,
|
||||
for (it_2.set(table_ref_2); !it_2.end_of_fields(); it_2.next())
|
||||
{
|
||||
Natural_join_column *cur_nj_col_2;
|
||||
const char *cur_field_name_2;
|
||||
const LEX_CSTRING *cur_field_name_2;
|
||||
if (!(cur_nj_col_2= it_2.get_or_create_column_ref(thd, leaf_2)))
|
||||
goto err;
|
||||
cur_field_name_2= cur_nj_col_2->name();
|
||||
DBUG_PRINT ("info", ("cur_field_name_2=%s.%s",
|
||||
cur_nj_col_2->table_name() ?
|
||||
cur_nj_col_2->table_name() : "",
|
||||
cur_field_name_2));
|
||||
cur_field_name_2->str));
|
||||
|
||||
/*
|
||||
Compare the two columns and check for duplicate common fields.
|
||||
@ -6400,13 +6399,14 @@ mark_common_columns(THD *thd, TABLE_LIST *table_ref_1, TABLE_LIST *table_ref_2,
|
||||
here. These columns must be checked only on unqualified reference
|
||||
by name (e.g. in SELECT list).
|
||||
*/
|
||||
if (!my_strcasecmp(system_charset_info, field_name_1, cur_field_name_2))
|
||||
if (!my_strcasecmp(system_charset_info, field_name_1->str,
|
||||
cur_field_name_2->str))
|
||||
{
|
||||
DBUG_PRINT ("info", ("match c1.is_common=%d", nj_col_1->is_common));
|
||||
if (cur_nj_col_2->is_common ||
|
||||
(found && (!using_fields || is_using_column_1)))
|
||||
{
|
||||
my_error(ER_NON_UNIQ_ERROR, MYF(0), field_name_1, thd->where);
|
||||
my_error(ER_NON_UNIQ_ERROR, MYF(0), field_name_1->str, thd->where);
|
||||
goto err;
|
||||
}
|
||||
nj_col_2= cur_nj_col_2;
|
||||
@ -6497,10 +6497,10 @@ mark_common_columns(THD *thd, TABLE_LIST *table_ref_1, TABLE_LIST *table_ref_2,
|
||||
DBUG_PRINT ("info", ("%s.%s and %s.%s are common",
|
||||
nj_col_1->table_name() ?
|
||||
nj_col_1->table_name() : "",
|
||||
nj_col_1->name(),
|
||||
nj_col_1->name()->str,
|
||||
nj_col_2->table_name() ?
|
||||
nj_col_2->table_name() : "",
|
||||
nj_col_2->name()));
|
||||
nj_col_2->name()->str));
|
||||
|
||||
if (field_1)
|
||||
{
|
||||
@ -6638,7 +6638,7 @@ store_natural_using_join_columns(THD *thd, TABLE_LIST *natural_using_join,
|
||||
goto err;
|
||||
}
|
||||
if (!my_strcasecmp(system_charset_info,
|
||||
common_field->name(), using_field_name_ptr))
|
||||
common_field->name()->str, using_field_name_ptr))
|
||||
break; // Found match
|
||||
}
|
||||
}
|
||||
@ -6965,8 +6965,7 @@ int setup_wild(THD *thd, TABLE_LIST *tables, List<Item> &fields,
|
||||
while (wild_num && (item= it++))
|
||||
{
|
||||
if (item->type() == Item::FIELD_ITEM &&
|
||||
((Item_field*) item)->field_name &&
|
||||
((Item_field*) item)->field_name[0] == '*' &&
|
||||
((Item_field*) item)->field_name.str == star_clex_str.str &&
|
||||
!((Item_field*) item)->field)
|
||||
{
|
||||
uint elem= fields.elements;
|
||||
@ -7584,7 +7583,7 @@ insert_fields(THD *thd, Name_resolution_context *context, const char *db_name,
|
||||
!(fld->have_privileges=
|
||||
(get_column_grant(thd, field_iterator.grant(),
|
||||
field_iterator.get_db_name(),
|
||||
field_table_name, fld->field_name) &
|
||||
field_table_name, fld->field_name.str) &
|
||||
VIEW_ANY_ACL)))
|
||||
{
|
||||
my_error(ER_TABLEACCESS_DENIED_ERROR, MYF(0), "ANY",
|
||||
@ -7913,7 +7912,7 @@ fill_record(THD *thd, TABLE *table_arg, List<Item> &fields, List<Item> &values,
|
||||
fld= (Item_field*)f++;
|
||||
if (!(field= fld->field_for_view_update()))
|
||||
{
|
||||
my_error(ER_NONUPDATEABLE_COLUMN, MYF(0), fld->name);
|
||||
my_error(ER_NONUPDATEABLE_COLUMN, MYF(0), fld->name.str);
|
||||
goto err;
|
||||
}
|
||||
DBUG_ASSERT(field->field->table == table_arg);
|
||||
@ -7925,7 +7924,7 @@ fill_record(THD *thd, TABLE *table_arg, List<Item> &fields, List<Item> &values,
|
||||
{
|
||||
if (!(field= fld->field_for_view_update()))
|
||||
{
|
||||
my_error(ER_NONUPDATEABLE_COLUMN, MYF(0), fld->name);
|
||||
my_error(ER_NONUPDATEABLE_COLUMN, MYF(0), fld->name.str);
|
||||
goto err;
|
||||
}
|
||||
value=v++;
|
||||
@ -7943,7 +7942,7 @@ fill_record(THD *thd, TABLE *table_arg, List<Item> &fields, List<Item> &values,
|
||||
push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN,
|
||||
ER_WARNING_NON_DEFAULT_VALUE_FOR_VIRTUAL_COLUMN,
|
||||
ER_THD(thd, ER_WARNING_NON_DEFAULT_VALUE_FOR_VIRTUAL_COLUMN),
|
||||
rfield->field_name, table->s->table_name.str);
|
||||
rfield->field_name.str, table->s->table_name.str);
|
||||
}
|
||||
if (rfield->stored_in_db() &&
|
||||
(value->save_in_field(rfield, 0)) < 0 && !ignore_errors)
|
||||
@ -8188,7 +8187,7 @@ fill_record(THD *thd, TABLE *table, Field **ptr, List<Item> &values,
|
||||
push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN,
|
||||
ER_WARNING_NON_DEFAULT_VALUE_FOR_VIRTUAL_COLUMN,
|
||||
ER_THD(thd, ER_WARNING_NON_DEFAULT_VALUE_FOR_VIRTUAL_COLUMN),
|
||||
field->field_name, table->s->table_name.str);
|
||||
field->field_name.str, table->s->table_name.str);
|
||||
}
|
||||
}
|
||||
|
||||
@ -8452,7 +8451,7 @@ int init_ftfuncs(THD *thd, SELECT_LEX *select_lex, bool no_order)
|
||||
}
|
||||
|
||||
|
||||
bool is_equal(const LEX_STRING *a, const LEX_STRING *b)
|
||||
bool is_equal(const LEX_CSTRING *a, const LEX_CSTRING *b)
|
||||
{
|
||||
return a->length == b->length && !strncmp(a->str, b->str, a->length);
|
||||
}
|
||||
|
Reference in New Issue
Block a user