mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
Fixed Bug#2813, "analyse does not quot string values in enams from string".
This commit is contained in:
@ -59,6 +59,7 @@ int compare_ulonglong2(void* cmp_arg __attribute__((unused)),
|
||||
return compare_ulonglong(s,t);
|
||||
}
|
||||
|
||||
static bool append_escaped(String *to_str, String *from_str);
|
||||
|
||||
Procedure *
|
||||
proc_analyse_init(THD *thd, ORDER *param, select_result *result,
|
||||
@ -890,7 +891,8 @@ int collect_string(String *element,
|
||||
else
|
||||
info->found = 1;
|
||||
info->str->append('\'');
|
||||
info->str->append(*element);
|
||||
if (append_escaped(info->str, element))
|
||||
return 1;
|
||||
info->str->append('\'');
|
||||
return 0;
|
||||
} // collect_string
|
||||
@ -1025,3 +1027,58 @@ uint check_ulonglong(const char *str, uint length)
|
||||
while (*cmp && *cmp++ == *str++) ;
|
||||
return ((uchar) str[-1] <= (uchar) cmp[-1]) ? smaller : bigger;
|
||||
} /* check_ulonlong */
|
||||
|
||||
|
||||
|
||||
/*
|
||||
FUNCTION: append_escaped()
|
||||
|
||||
DESCRIPTION
|
||||
append_escaped() takes a String type variable, where it appends
|
||||
escaped the second argument. Only characters that require escaping
|
||||
will be escaped.
|
||||
|
||||
ARGUMENTS
|
||||
A pointer to a String variable, where results will be appended
|
||||
A pointer to a String variable, which is appended to the result
|
||||
String, escaping those characters that require it.
|
||||
|
||||
RETURN VALUES
|
||||
0 Success
|
||||
1 Out of memory
|
||||
*/
|
||||
|
||||
static bool append_escaped(String *to_str, String *from_str)
|
||||
{
|
||||
char *from, *end, c;
|
||||
|
||||
if (to_str->realloc(to_str->length() + from_str->length()))
|
||||
return 1;
|
||||
|
||||
from= (char*) from_str->ptr();
|
||||
end= from + from_str->length();
|
||||
for (; from < end; from++)
|
||||
{
|
||||
c= *from;
|
||||
switch (c) {
|
||||
case '\0':
|
||||
c= '0';
|
||||
break;
|
||||
case '\032':
|
||||
c= 'Z';
|
||||
break;
|
||||
case '\\':
|
||||
case '\'':
|
||||
break;
|
||||
default:
|
||||
goto normal_character;
|
||||
}
|
||||
if (to_str->append('\\'))
|
||||
return 1;
|
||||
|
||||
normal_character:
|
||||
if (to_str->append(c))
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
Reference in New Issue
Block a user