in src/java/org/apache/cassandra/cql3/functions/types/ParseUtils.java [74:150]
static int skipCQLValue(String toParse, int idx)
{
if (idx >= toParse.length()) throw new IllegalArgumentException();
if (isBlank(toParse.charAt(idx))) throw new IllegalArgumentException();
int cbrackets = 0;
int sbrackets = 0;
int parens = 0;
boolean inString = false;
do
{
char c = toParse.charAt(idx);
if (inString)
{
if (c == '\'')
{
if (idx + 1 < toParse.length() && toParse.charAt(idx + 1) == '\'')
{
++idx; // this is an escaped quote, skip it
}
else
{
inString = false;
if (cbrackets == 0 && sbrackets == 0 && parens == 0) return idx + 1;
}
}
// Skip any other character
}
else if (c == '\'')
{
inString = true;
}
else if (c == '{')
{
++cbrackets;
}
else if (c == '[')
{
++sbrackets;
}
else if (c == '(')
{
++parens;
}
else if (c == '}')
{
if (cbrackets == 0) return idx;
--cbrackets;
if (cbrackets == 0 && sbrackets == 0 && parens == 0) return idx + 1;
}
else if (c == ']')
{
if (sbrackets == 0) return idx;
--sbrackets;
if (cbrackets == 0 && sbrackets == 0 && parens == 0) return idx + 1;
}
else if (c == ')')
{
if (parens == 0) return idx;
--parens;
if (cbrackets == 0 && sbrackets == 0 && parens == 0) return idx + 1;
}
else if (isBlank(c) || !isIdentifierChar(c))
{
if (cbrackets == 0 && sbrackets == 0 && parens == 0) return idx;
}
} while (++idx < toParse.length());
if (inString || cbrackets != 0 || sbrackets != 0 || parens != 0)
throw new IllegalArgumentException();
return idx;
}