MXS-1702: Fix minor canonicalization bugs

Allow hexadecimal digits if a 0x prefix has been seen. Squash repeating
whitespace and remove quotes from quoted strings.
This commit is contained in:
Markus Mäkelä
2018-03-16 09:21:25 +02:00
parent 8d3f02b8a4
commit a627e342f3

View File

@ -1193,19 +1193,27 @@ static std::pair<bool, mxs::Buffer::iterator> probe_number(mxs::Buffer::iterator
ss_dassert(isdigit(*it)); ss_dassert(isdigit(*it));
std::pair<bool, mxs::Buffer::iterator> rval = std::make_pair(true, it); std::pair<bool, mxs::Buffer::iterator> rval = std::make_pair(true, it);
bool is_hex = *it == '0'; bool is_hex = *it == '0';
bool allow_hex = false;
// Skip the first character, we know it's a number // Skip the first character, we know it's a number
it++; it++;
while (it != end) while (it != end)
{ {
if (!isdigit(*it)) if (isdigit(*it) || (allow_hex && isxdigit(*it)))
{ {
// Digit or hex-digit, skip it
}
else
{
// Non-digit character
if (is_hex && (*it == 'x' || *it == 'X')) if (is_hex && (*it == 'x' || *it == 'X'))
{ {
/** A hexadecimal literal, mark that we've seen the `x` so that /** A hexadecimal literal, mark that we've seen the `x` so that
* if another one is seen, it is treated as a normal character */ * if another one is seen, it is treated as a normal character */
is_hex = false; is_hex = false;
allow_hex = true;
} }
else if (*it == 'e') else if (*it == 'e')
{ {
@ -1318,7 +1326,7 @@ char* modutil_get_new_canonical(GWBUF* querybuf)
case SINGLE_QUOTE: case SINGLE_QUOTE:
if (*it == '\'') if (*it == '\'')
{ {
rval += "'?'"; rval += '?';
my_state = NONE; my_state = NONE;
} }
break; break;
@ -1326,7 +1334,7 @@ char* modutil_get_new_canonical(GWBUF* querybuf)
case DOUBLE_QUOTE: case DOUBLE_QUOTE:
if (*it == '"') if (*it == '"')
{ {
rval += "\"?\""; rval += '?';
my_state = NONE; my_state = NONE;
} }
break; break;
@ -1334,6 +1342,11 @@ char* modutil_get_new_canonical(GWBUF* querybuf)
default: default:
if (isspace(*it)) if (isspace(*it))
{ {
if (isspace(prev))
{
// Repeating space, skip it
continue;
}
*it = ' '; *it = ' ';
} }
else if (isdigit(*it) && !isalpha(prev) && !isdigit(prev) && prev != '_') else if (isdigit(*it) && !isalpha(prev) && !isdigit(prev) && prev != '_')