Skip to content

Commit

Permalink
MDEV-31950 Cleanup: Move MEM_ROOT allocation methods from THD to Quer…
Browse files Browse the repository at this point in the history
…y_arena
  • Loading branch information
abarkov committed Aug 18, 2023
1 parent 485c9b1 commit 39bafad
Showing 1 changed file with 101 additions and 84 deletions.
185 changes: 101 additions & 84 deletions sql/sql_class.h
Original file line number Diff line number Diff line change
Expand Up @@ -1254,6 +1254,107 @@ class Query_arena
return ptr;
}

/*
Methods to copy a string to the memory root
and return the value as a LEX_CSTRING.
*/
LEX_CSTRING strmake_lex_cstring(const char *str, size_t length) const
{
const char *tmp= strmake_root(mem_root, str, length);
if (!tmp)
return {0,0};
return {tmp, length};
}
LEX_CSTRING strmake_lex_cstring(const LEX_CSTRING &from) const
{
return strmake_lex_cstring(from.str, from.length);
}

/*
Methods to copy a string to memory root,
write the result to the out parameter,
and return as a LEX_STRING/LEX_CSTRING pointer.
*/
LEX_STRING *make_lex_string(LEX_STRING *lex_str, const char* str,
size_t length) const
{
if (!(lex_str->str= strmake_root(mem_root, str, length)))
{
lex_str->length= 0;
return 0;
}
lex_str->length= length;
return lex_str;
}
LEX_CSTRING *make_lex_string(LEX_CSTRING *lex_str, const char* str,
size_t length) const
{
if (!(lex_str->str= strmake_root(mem_root, str, length)))
{
lex_str->length= 0;
return 0;
}
lex_str->length= length;
return lex_str;
}

/*
Methods to copy a string value on memory root,
but also allocate on memory root LEX_CSTRING itself
and return a pointer to it.
*/
LEX_CSTRING *make_clex_string(const char* str, size_t length) const
{
LEX_CSTRING *lex_str;
char *tmp;
if (unlikely(!(lex_str= (LEX_CSTRING *)alloc_root(mem_root,
sizeof(LEX_CSTRING) +
length+1))))
return 0;
tmp= (char*) (lex_str+1);
lex_str->str= tmp;
memcpy(tmp, str, length);
tmp[length]= 0;
lex_str->length= length;
return lex_str;
}
LEX_CSTRING *make_clex_string(const LEX_CSTRING from) const
{
return make_clex_string(from.str, from.length);
}

// Allocate LEX_STRING for character set conversion
bool alloc_lex_string(LEX_STRING *dst, size_t length) const
{
if (likely((dst->str= (char*) alloc(length))))
return false;
dst->length= 0; // Safety
return true; // EOM
}

// Remove double quotes: aaa""bbb -> aaa"bbb
bool quote_unescape(LEX_CSTRING *dst, const LEX_CSTRING *src,
char quote) const
{
const char *tmp= src->str;
const char *tmpend= src->str + src->length;
char *to;
if (!(dst->str= to= (char *) alloc(src->length + 1)))
{
dst->length= 0; // Safety
return true;
}
for ( ; tmp < tmpend; )
{
if ((*to++= *tmp++) == quote)
tmp++; // Skip double quotes
}
*to= 0; // End null for safety
dst->length= to - dst->str;
return false;
}


void set_query_arena(Query_arena *set);

void free_items();
Expand Down Expand Up @@ -4164,90 +4265,6 @@ class THD: public THD_count, /* this must be first */
return alloc_root(&transaction->mem_root,size);
}

LEX_CSTRING strmake_lex_cstring(const char *str, size_t length) const
{
const char *tmp= strmake_root(mem_root, str, length);
if (!tmp)
return {0,0};
return {tmp, length};
}
LEX_CSTRING strmake_lex_cstring(const LEX_CSTRING &from) const
{
return strmake_lex_cstring(from.str, from.length);
}

LEX_STRING *make_lex_string(LEX_STRING *lex_str, const char* str,
size_t length) const
{
if (!(lex_str->str= strmake_root(mem_root, str, length)))
{
lex_str->length= 0;
return 0;
}
lex_str->length= length;
return lex_str;
}
LEX_CSTRING *make_lex_string(LEX_CSTRING *lex_str, const char* str,
size_t length) const
{
if (!(lex_str->str= strmake_root(mem_root, str, length)))
{
lex_str->length= 0;
return 0;
}
lex_str->length= length;
return lex_str;
}
// Remove double quotes: aaa""bbb -> aaa"bbb
bool quote_unescape(LEX_CSTRING *dst, const LEX_CSTRING *src,
char quote) const
{
const char *tmp= src->str;
const char *tmpend= src->str + src->length;
char *to;
if (!(dst->str= to= (char *) alloc(src->length + 1)))
{
dst->length= 0; // Safety
return true;
}
for ( ; tmp < tmpend; )
{
if ((*to++= *tmp++) == quote)
tmp++; // Skip double quotes
}
*to= 0; // End null for safety
dst->length= to - dst->str;
return false;
}

LEX_CSTRING *make_clex_string(const char* str, size_t length) const
{
LEX_CSTRING *lex_str;
char *tmp;
if (unlikely(!(lex_str= (LEX_CSTRING *)alloc_root(mem_root,
sizeof(LEX_CSTRING) +
length+1))))
return 0;
tmp= (char*) (lex_str+1);
lex_str->str= tmp;
memcpy(tmp, str, length);
tmp[length]= 0;
lex_str->length= length;
return lex_str;
}
LEX_CSTRING *make_clex_string(const LEX_CSTRING from) const
{
return make_clex_string(from.str, from.length);
}

// Allocate LEX_STRING for character set conversion
bool alloc_lex_string(LEX_STRING *dst, size_t length) const
{
if (likely((dst->str= (char*) alloc(length))))
return false;
dst->length= 0; // Safety
return true; // EOM
}
bool convert_string(LEX_STRING *to, CHARSET_INFO *to_cs,
const char *from, size_t from_length,
CHARSET_INFO *from_cs) const;
Expand Down

0 comments on commit 39bafad

Please sign in to comment.