Skip to content

Commit ea4ced2

Browse files
committed
fix: skipHint in the internal parser skipped too much
1 parent 7f6b43c commit ea4ced2

File tree

2 files changed

+27
-1
lines changed

2 files changed

+27
-1
lines changed

google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/SimpleParser.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ void skipHint() {
138138
// comments and comments are automatically skipped by all methods.
139139
if (getDialect() == Dialect.GOOGLE_STANDARD_SQL && eatTokens('@', '{')) {
140140
while (pos < length && !eatToken('}')) {
141-
pos += statementParser.skip(sql, pos, /*result=*/ null);
141+
pos = statementParser.skip(sql, pos, /*result=*/ null);
142142
}
143143
}
144144
}

google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/SimpleParserTest.java

+26
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import static org.junit.Assert.assertNotEquals;
2424
import static org.junit.Assert.assertNull;
2525
import static org.junit.Assert.assertTrue;
26+
import static org.junit.Assume.assumeTrue;
2627

2728
import com.google.cloud.spanner.Dialect;
2829
import org.junit.Test;
@@ -221,4 +222,29 @@ public void testEatSingleQuotedStringAdvancesPosition() {
221222
assertEquals(NOT_FOUND, parser.eatSingleQuotedString());
222223
assertEquals(parser.getSql().length(), parser.getPos());
223224
}
225+
226+
@Test
227+
public void testSkipHint() {
228+
assumeTrue("Hints in PostgreSQL are comments", dialect == Dialect.GOOGLE_STANDARD_SQL);
229+
230+
assertEquals("SELECT 1", skipHint("SELECT 1"));
231+
assertEquals("SELECT 1", skipHint("@{rpc_priority=HIGH}SELECT 1"));
232+
assertEquals("SELECT 1", skipHint("@{statement_tag='test'}SELECT 1"));
233+
assertEquals(" \nSELECT 1", skipHint(" @{statement_tag = 'test'} \nSELECT 1"));
234+
assertEquals(
235+
" /* comment after */ SELECT 1",
236+
skipHint("/* comment before */ @{statement_tag='test'} /* comment after */ SELECT 1"));
237+
assertEquals(
238+
" -- comment after\nSELECT 1",
239+
skipHint("-- comment before\n @{statement_tag='test'} -- comment after\nSELECT 1"));
240+
assertEquals(
241+
"-- comment @{statement_tag='test'}\n -- also a comment\nSELECT 1",
242+
skipHint("-- comment @{statement_tag='test'}\n -- also a comment\nSELECT 1"));
243+
}
244+
245+
static String skipHint(String sql) {
246+
SimpleParser parser = new SimpleParser(Dialect.GOOGLE_STANDARD_SQL, sql);
247+
parser.skipHint();
248+
return parser.getSql().substring(parser.getPos());
249+
}
224250
}

0 commit comments

Comments
 (0)