summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMonty <monty@mariadb.org>2020-08-14 20:22:43 +0300
committerSergei Golubchik <serg@mariadb.org>2021-05-19 22:27:29 +0200
commitb3bc02f923f6002e6a5bd6446b80575292e1b0c7 (patch)
tree3d5032511ca892a1ce4c0649b3a046cb83c92c7f
parent5c7d243b29257fe02edaea42730893d4d185ced5 (diff)
downloadmariadb-git-b3bc02f923f6002e6a5bd6446b80575292e1b0c7.tar.gz
Added ErrConvString.lex_cstring() to simplify code
This allows us to use String::append() without using strlen(). The changes to the ErrConvString class where done by Alexander Barkov
-rw-r--r--sql/item.cc2
-rw-r--r--sql/key.cc2
-rw-r--r--sql/sql_class.h6
-rw-r--r--sql/sql_error.cc8
-rw-r--r--sql/sql_error.h56
-rw-r--r--storage/connect/ha_connect.cc8
6 files changed, 46 insertions, 36 deletions
diff --git a/sql/item.cc b/sql/item.cc
index 84fb509f024..fe5b45f31a9 100644
--- a/sql/item.cc
+++ b/sql/item.cc
@@ -3816,7 +3816,7 @@ void Item_string::print(String *str, enum_query_type query_type)
changed.
*/
ErrConvString tmp(str_value.ptr(), str_value.length(), &my_charset_bin);
- str->append(tmp.ptr());
+ str->append(tmp.lex_cstring());
}
else
{
diff --git a/sql/key.cc b/sql/key.cc
index 53f897de15f..32b4bd9c167 100644
--- a/sql/key.cc
+++ b/sql/key.cc
@@ -393,7 +393,7 @@ void field_unpack(String *to, Field *field, const uchar *rec, uint max_length,
if (max_length < field->pack_length())
tmp.length(MY_MIN(tmp.length(),max_length));
ErrConvString err(&tmp);
- to->append(err.ptr());
+ to->append(err.lex_cstring());
}
else
to->append(STRING_WITH_LEN("???"));
diff --git a/sql/sql_class.h b/sql/sql_class.h
index 8a0463f9f8e..1546e5e65b1 100644
--- a/sql/sql_class.h
+++ b/sql/sql_class.h
@@ -7558,10 +7558,10 @@ public:
ErrConvDQName(const Database_qualified_name *name)
:m_name(name)
{ }
- const char *ptr() const
+ LEX_CSTRING lex_cstring() const override
{
- m_name->make_qname(err_buffer, sizeof(err_buffer));
- return err_buffer;
+ size_t length= m_name->make_qname(err_buffer, sizeof(err_buffer));
+ return {err_buffer, length};
}
};
diff --git a/sql/sql_error.cc b/sql/sql_error.cc
index 9af57ea6c01..bb47502b3ce 100644
--- a/sql/sql_error.cc
+++ b/sql/sql_error.cc
@@ -864,11 +864,11 @@ extern "C" int my_wc_mb_utf8_null_terminated(CHARSET_INFO *cs,
@param from_cs charset from convert
@retval
- result string
+ result string length
*/
-char *err_conv(char *buff, uint to_length, const char *from,
- uint from_length, CHARSET_INFO *from_cs)
+size_t err_conv(char *buff, uint to_length, const char *from,
+ uint from_length, CHARSET_INFO *from_cs)
{
char *to= buff;
const char *from_start= from;
@@ -919,7 +919,7 @@ char *err_conv(char *buff, uint to_length, const char *from,
&errors);
to[res]= 0;
}
- return buff;
+ return res;
}
diff --git a/sql/sql_error.h b/sql/sql_error.h
index 318d5076534..a3782048c79 100644
--- a/sql/sql_error.h
+++ b/sql/sql_error.h
@@ -811,8 +811,8 @@ private:
};
-extern char *err_conv(char *buff, uint to_length, const char *from,
- uint from_length, CHARSET_INFO *from_cs);
+extern size_t err_conv(char *buff, uint to_length, const char *from,
+ uint from_length, CHARSET_INFO *from_cs);
class ErrBuff
{
@@ -824,31 +824,37 @@ public:
err_buffer[0]= '\0';
}
const char *ptr() const { return err_buffer; }
- const char *set_longlong(const Longlong_hybrid &nr) const
+ LEX_CSTRING set_longlong(const Longlong_hybrid &nr) const
{
- return nr.is_unsigned() ? ullstr(nr.value(), err_buffer) :
- llstr(nr.value(), err_buffer);
+ int radix= nr.is_unsigned() ? 10 : -10;
+ const char *end= longlong10_to_str(nr.value(), err_buffer, radix);
+ DBUG_ASSERT(end >= err_buffer);
+ return {err_buffer, (size_t) (end - err_buffer)};
}
- const char *set_double(double nr) const
+ LEX_CSTRING set_double(double nr) const
{
- my_gcvt(nr, MY_GCVT_ARG_DOUBLE, sizeof(err_buffer), err_buffer, 0);
- return err_buffer;
+ size_t length= my_gcvt(nr, MY_GCVT_ARG_DOUBLE,
+ sizeof(err_buffer), err_buffer, 0);
+ return {err_buffer, length};
}
- const char *set_decimal(const decimal_t *d) const
+ LEX_CSTRING set_decimal(const decimal_t *d) const
{
- int len= sizeof(err_buffer);
- decimal2string(d, err_buffer, &len, 0, 0, ' ');
- return err_buffer;
+ int length= sizeof(err_buffer);
+ decimal2string(d, err_buffer, &length, 0, 0, ' ');
+ DBUG_ASSERT(length >= 0);
+ return {err_buffer, (size_t) length};
}
- const char *set_str(const char *str, size_t len, CHARSET_INFO *cs) const
+ LEX_CSTRING set_str(const char *str, size_t len, CHARSET_INFO *cs) const
{
DBUG_ASSERT(len < UINT_MAX32);
- return err_conv(err_buffer, (uint) sizeof(err_buffer), str, (uint) len, cs);
+ len= err_conv(err_buffer, (uint) sizeof(err_buffer), str, (uint) len, cs);
+ return {err_buffer, len};
}
- const char *set_mysql_time(const MYSQL_TIME *ltime) const
+ LEX_CSTRING set_mysql_time(const MYSQL_TIME *ltime) const
{
- my_TIME_to_str(ltime, err_buffer, AUTO_SEC_PART_DIGITS);
- return err_buffer;
+ int length= my_TIME_to_str(ltime, err_buffer, AUTO_SEC_PART_DIGITS);
+ DBUG_ASSERT(length >= 0);
+ return {err_buffer, (size_t) length};
}
};
@@ -858,7 +864,11 @@ class ErrConv: public ErrBuff
public:
ErrConv() {}
virtual ~ErrConv() {}
- virtual const char *ptr() const = 0;
+ virtual LEX_CSTRING lex_cstring() const= 0;
+ inline const char *ptr() const
+ {
+ return lex_cstring().str;
+ }
};
class ErrConvString : public ErrConv
@@ -873,7 +883,7 @@ public:
: ErrConv(), str(str_arg), len(strlen(str_arg)), cs(cs_arg) {}
ErrConvString(const String *s)
: ErrConv(), str(s->ptr()), len(s->length()), cs(s->charset()) {}
- const char *ptr() const
+ LEX_CSTRING lex_cstring() const override
{
return set_str(str, len, cs);
}
@@ -884,7 +894,7 @@ class ErrConvInteger : public ErrConv, public Longlong_hybrid
public:
ErrConvInteger(const Longlong_hybrid &nr)
: ErrConv(), Longlong_hybrid(nr) { }
- const char *ptr() const
+ LEX_CSTRING lex_cstring() const override
{
return set_longlong(static_cast<Longlong_hybrid>(*this));
}
@@ -895,7 +905,7 @@ class ErrConvDouble: public ErrConv
double num;
public:
ErrConvDouble(double num_arg) : ErrConv(), num(num_arg) {}
- const char *ptr() const
+ LEX_CSTRING lex_cstring() const override
{
return set_double(num);
}
@@ -906,7 +916,7 @@ class ErrConvTime : public ErrConv
const MYSQL_TIME *ltime;
public:
ErrConvTime(const MYSQL_TIME *ltime_arg) : ErrConv(), ltime(ltime_arg) {}
- const char *ptr() const
+ LEX_CSTRING lex_cstring() const override
{
return set_mysql_time(ltime);
}
@@ -917,7 +927,7 @@ class ErrConvDecimal : public ErrConv
const decimal_t *d;
public:
ErrConvDecimal(const decimal_t *d_arg) : ErrConv(), d(d_arg) {}
- const char *ptr() const
+ LEX_CSTRING lex_cstring() const override
{
return set_decimal(d);
}
diff --git a/storage/connect/ha_connect.cc b/storage/connect/ha_connect.cc
index 9e1d7502dcf..1474af92933 100644
--- a/storage/connect/ha_connect.cc
+++ b/storage/connect/ha_connect.cc
@@ -3480,11 +3480,11 @@ bool ha_connect::get_error_message(int error, String* buf)
if (trace(1))
htrc("GEM(%d): %s\n", error, g->Message);
-
- buf->append(ErrConvString(g->Message, strlen(g->Message),
- &my_charset_latin1).ptr());
+ buf->append(ErrConvString(g->Message,
+ strlen(g->Message),
+ &my_charset_latin1).lex_cstring());
} else
- buf->append("Cannot retrieve error message");
+ buf->append(STRING_WITH_LEN("Cannot retrieve error message"));
DBUG_RETURN(false);
} // end of get_error_message