Skip to content

Commit 9c76556

Browse files
fix(parser): grammar ambiguities
Signed-off-by: Andreas Reichel <andreas@manticore-projects.com>
1 parent 84d23e7 commit 9c76556

1 file changed

Lines changed: 17 additions & 10 deletions

File tree

‎src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt‎

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)