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:
@ -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 != '_')
|
||||||
|
|||||||
Reference in New Issue
Block a user