summaryrefslogtreecommitdiff
path: root/sql/sql_string.cc
diff options
context:
space:
mode:
authorMarko Mäkelä <marko.makela@mariadb.com>2018-10-09 09:11:30 +0300
committerMarko Mäkelä <marko.makela@mariadb.com>2018-10-09 09:11:30 +0300
commit43ee6915fa4b8e3088e89b7d4325946190ce04f5 (patch)
treee580d22b0ff6faed1720f88ddeedf86a0867fa41 /sql/sql_string.cc
parent7d4beb7286d53be07ff552de9d37ea90c2762651 (diff)
parent1ebe841fb85725c2a6aaecb3bca41ec098a5193d (diff)
downloadmariadb-git-43ee6915fa4b8e3088e89b7d4325946190ce04f5.tar.gz
Merge 10.2 into 10.3
Diffstat (limited to 'sql/sql_string.cc')
-rw-r--r--sql/sql_string.cc23
1 files changed, 21 insertions, 2 deletions
diff --git a/sql/sql_string.cc b/sql/sql_string.cc
index 5d5cc90431b..cc77452ecd1 100644
--- a/sql/sql_string.cc
+++ b/sql/sql_string.cc
@@ -238,9 +238,9 @@ bool String::copy(const String &str)
bool String::copy(const char *str,size_t arg_length, CHARSET_INFO *cs)
{
+ DBUG_ASSERT(arg_length < UINT_MAX32);
if (alloc(arg_length))
return TRUE;
- DBUG_ASSERT(arg_length < UINT_MAX32);
if (Ptr == str && arg_length == uint32(str_length))
{
/*
@@ -257,6 +257,24 @@ bool String::copy(const char *str,size_t arg_length, CHARSET_INFO *cs)
return FALSE;
}
+/*
+ Copy string, where strings may overlap.
+ Same as String::copy, but use memmove instead of memcpy to avoid warnings
+ from valgrind
+*/
+
+bool String::copy_or_move(const char *str,size_t arg_length, CHARSET_INFO *cs)
+{
+ DBUG_ASSERT(arg_length < UINT_MAX32);
+ if (alloc(arg_length))
+ return TRUE;
+ if ((str_length=uint32(arg_length)))
+ memmove(Ptr,str,arg_length);
+ Ptr[arg_length]=0;
+ str_charset=cs;
+ return FALSE;
+}
+
/*
Checks that the source string can be just copied to the destination string
@@ -390,8 +408,9 @@ bool String::set_or_copy_aligned(const char *str, size_t arg_length,
/* How many bytes are in incomplete character */
size_t offset= (arg_length % cs->mbminlen);
- if (!offset) /* All characters are complete, just copy */
+ if (!offset)
{
+ /* All characters are complete, just use given string */
set(str, arg_length, cs);
return FALSE;
}