summaryrefslogtreecommitdiffstats
path: root/sql/sql_string.cc
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-05-18 13:22:53 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-05-18 13:22:53 +0000
commit347c164c35eddab388009470e6848cb361ac93f8 (patch)
tree2c0c44eac690f510bb0a35b2a13b36d606b77b6b /sql/sql_string.cc
parentReleasing progress-linux version 1:10.11.7-4~progress7.99u1. (diff)
downloadmariadb-347c164c35eddab388009470e6848cb361ac93f8.tar.xz
mariadb-347c164c35eddab388009470e6848cb361ac93f8.zip
Merging upstream version 1:10.11.8.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'sql/sql_string.cc')
-rw-r--r--sql/sql_string.cc47
1 files changed, 33 insertions, 14 deletions
diff --git a/sql/sql_string.cc b/sql/sql_string.cc
index 25521bb3..f5edb1a5 100644
--- a/sql/sql_string.cc
+++ b/sql/sql_string.cc
@@ -1145,26 +1145,45 @@ bool String::append_for_single_quote(const char *st, size_t len)
int chlen;
for (; st < end; st++)
{
- switch (*st)
+ char ch2= (char) (uchar) escaped_wc_for_single_quote((uchar) *st);
+ if (ch2)
{
- case '\\': APPEND(STRING_WITH_LEN("\\\\")); break;
- case '\0': APPEND(STRING_WITH_LEN("\\0")); break;
- case '\'': APPEND(STRING_WITH_LEN("\\'")); break;
- case '\n': APPEND(STRING_WITH_LEN("\\n")); break;
- case '\r': APPEND(STRING_WITH_LEN("\\r")); break;
- case '\032': APPEND(STRING_WITH_LEN("\\Z")); break;
- default: if ((chlen=charset()->charlen(st, end)) > 0)
- {
- APPEND(st, chlen);
- st+= chlen-1;
- }
- else
- APPEND(*st);
+ if (append('\\') || append(ch2))
+ return true;
+ continue;
}
+ if ((chlen= charset()->charlen(st, end)) > 0)
+ {
+ APPEND(st, chlen);
+ st+= chlen-1;
+ }
+ else
+ APPEND(*st);
}
return 0;
}
+
+bool String::append_for_single_quote_using_mb_wc(const char *src,
+ size_t length,
+ CHARSET_INFO *cs)
+{
+ DBUG_ASSERT(&my_charset_bin != charset());
+ DBUG_ASSERT(&my_charset_bin != cs);
+ const uchar *str= (const uchar *) src;
+ const uchar *end= (const uchar *) src + length;
+ int chlen;
+ my_wc_t wc;
+ for ( ; (chlen= cs->cset->mb_wc(cs, &wc, str, end)) > 0; str+= chlen)
+ {
+ my_wc_t wc2= escaped_wc_for_single_quote(wc);
+ if (wc2 ? (append_wc('\\') || append_wc(wc2)) : append_wc(wc))
+ return true;
+ }
+ return false;
+}
+
+
void String::print(String *str) const
{
str->append_for_single_quote(Ptr, str_length);