in oak-core/src/main/java/org/apache/jackrabbit/oak/query/SQL2Parser.java [1210:1349]
private void read() throws ParseException {
if (parseIndex >= characterTypes.length) {
throw getSyntaxError();
}
currentTokenQuoted = false;
if (expected != null) {
expected.clear();
}
int[] types = characterTypes;
int i = parseIndex;
int type = types[i];
while (type == 0) {
type = types[++i];
}
int start = i;
char[] chars = statementChars;
char c = chars[i++];
currentToken = "";
switch (type) {
case CHAR_NAME:
while (true) {
type = types[i];
if (type != CHAR_NAME && type != CHAR_VALUE) {
c = chars[i];
if (supportSQL1 && c == ':') {
i++;
continue;
}
break;
}
i++;
}
currentToken = statement.substring(start, i);
if (currentToken.isEmpty()) {
throw getSyntaxError();
}
currentTokenType = IDENTIFIER;
parseIndex = i;
return;
case CHAR_SPECIAL_2:
if (types[i] == CHAR_SPECIAL_2) {
i++;
}
currentToken = statement.substring(start, i);
currentTokenType = KEYWORD;
parseIndex = i;
return;
case CHAR_SPECIAL_1:
currentToken = statement.substring(start, i);
switch (c) {
case '$':
currentTokenType = PARAMETER;
break;
case '+':
currentTokenType = PLUS;
break;
case '-':
currentTokenType = MINUS;
break;
case '(':
currentTokenType = OPEN;
break;
case ')':
currentTokenType = CLOSE;
break;
default:
currentTokenType = KEYWORD;
}
parseIndex = i;
return;
case CHAR_VALUE:
long number = c - '0';
while (true) {
c = chars[i];
if (c < '0' || c > '9') {
if (c == '.') {
readDecimal(start, i);
break;
}
if (c == 'E' || c == 'e') {
readDecimal(start, i);
break;
}
checkLiterals(false);
currentValue = PropertyValues.newLong(number);
currentTokenType = VALUE;
currentToken = "0";
parseIndex = i;
break;
}
number = number * 10 + (c - '0');
if (number > Integer.MAX_VALUE) {
readDecimal(start, i);
break;
}
i++;
}
return;
case CHAR_DECIMAL:
if (types[i] != CHAR_VALUE) {
currentTokenType = KEYWORD;
currentToken = ".";
parseIndex = i;
return;
}
readDecimal(i - 1, i);
return;
case CHAR_BRACKETED:
currentTokenQuoted = true;
readString(i, ']');
currentTokenType = IDENTIFIER;
currentToken = currentValue.getValue(Type.STRING);
return;
case CHAR_STRING:
currentTokenQuoted = true;
readString(i, '\'');
return;
case CHAR_QUOTED:
currentTokenQuoted = true;
readString(i, '\"');
if (supportSQL1) {
// for SQL-2, this is a literal, as defined in
// the JCR 2.0 spec, 6.7.34 Literal - UncastLiteral
// but for compatibility with Jackrabbit 2.x, for
// SQL-1, this is an identifier, as in ANSI SQL
// (not in the JCR 1.0 spec)
// (confusing isn't it?)
currentTokenType = IDENTIFIER;
currentToken = currentValue.getValue(Type.STRING);
}
return;
case CHAR_END:
currentToken = "";
currentTokenType = END;
parseIndex = i;
return;
default:
throw getSyntaxError();
}
}