@@ -2070,18 +2070,18 @@ TOKEN:
20702070 if (!allowEscape) {
20712071 pos = indexOfSequence(img, "\\'");
20722072 if (pos > 0) {
2073- matchedToken.image = "'" + image.substring( 0, image.indexOf("\\'") + 1 ) + "'";
2073+ matchedToken.image = image.substring( 0, image.indexOf("\\'") + 1 ) + "'";
20742074 // `charLiteralIndex` defined in TokenManagerDeclaration above
20752075 matchedToken.kind = charLiteralIndex;
2076- input_stream.backup(image.length() + 1 - matchedToken.image.length());
2076+ input_stream.backup(image.length() - matchedToken.image.length());
20772077 }
20782078 } else {
20792079 pos = lastIndexOfSequence(img, "\\''");
20802080 if (pos > 0) {
2081- matchedToken.image = "'" + image.substring( 0, image.lastIndexOf("\\'") + 3);
2081+ matchedToken.image = image.substring( 0, image.lastIndexOf("\\'") + 3);
20822082 // `charLiteralIndex` defined in TokenManagerDeclaration above
20832083 matchedToken.kind = charLiteralIndex;
2084- input_stream.backup(image.length() + 1 - matchedToken.image.length() );
2084+ input_stream.backup(image.length() - matchedToken.image.length() );
20852085 }
20862086 }
20872087 }
@@ -7132,7 +7132,7 @@ List<InterpolateElement> InterpolateClause():
71327132}
71337133{
71347134 <K_INTERPOLATE>
7135- [ "("
7135+ [ LOOKAHEAD(2) "("
71367136 [ interpolateElement = InterpolateElement() { interpolateElements.add(interpolateElement); }
71377137 ( "," interpolateElement = InterpolateElement() { interpolateElements.add(interpolateElement); } )*
71387138 ]
@@ -9718,11 +9718,18 @@ IntervalExpression IntervalExpression() : {
97189718 }
97199719 }
97209720 [
9721- // Standard qualifier (field [TO field] [(precision)]) such as DAY or DAY TO SECOND.
9722- LOOKAHEAD(2, { getToken(1).kind == K_DATE_LITERAL }) qualifier = IntervalQualifier() { interval.setIntervalQualifier(qualifier); }
9723- // Non-standard single identifier field (e.g. MySQL `INTERVAL 1 foo`), kept for
9724- // backwards compatibility.
9725- | LOOKAHEAD(2) (token = <S_IDENTIFIER>) { interval.setIntervalType(token.image); }
9721+ // The entry decision for this optional block has to be stated explicitly: <S_IDENTIFIER>
9722+ // also starts whatever follows IntervalExpression() at its call sites (an alias, for
9723+ // instance), so one token of lookahead cannot decide whether to enter.
9724+ LOOKAHEAD({ getToken(1).kind == K_DATE_LITERAL || getToken(1).kind == S_IDENTIFIER })
9725+ (
9726+ // Standard qualifier (field [TO field] [(precision)]) such as DAY or DAY TO SECOND.
9727+ LOOKAHEAD({ getToken(1).kind == K_DATE_LITERAL }) qualifier = IntervalQualifier() { interval.setIntervalQualifier(qualifier); }
9728+ |
9729+ // Non-standard single identifier field (e.g. MySQL `INTERVAL 1 foo`), kept for
9730+ // backwards compatibility.
9731+ token = <S_IDENTIFIER> { interval.setIntervalType(token.image); }
9732+ )
97269733 ]
97279734 {
97289735 return interval;
0 commit comments