This is an automated email from the ASF dual-hosted git repository.
FlyingZC pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shardingsphere.git
The following commit(s) were added to refs/heads/master by this push:
new d2174d396a8 Remove OracleParserTest (#40234)
d2174d396a8 is described below
commit d2174d396a87c1a768e54d81d90ed5638a4fcce6
Author: Cong Hu <[email protected]>
AuthorDate: Mon Oct 19 11:55:39 2026 +0800
Remove OracleParserTest (#40234)
---
.../engine/oracle/parser/OracleParserTest.java | 225 ---------------------
1 file changed, 225 deletions(-)
diff --git
a/parser/sql/engine/dialect/oracle/src/test/java/org/apache/shardingsphere/sql/parser/engine/oracle/parser/OracleParserTest.java
b/parser/sql/engine/dialect/oracle/src/test/java/org/apache/shardingsphere/sql/parser/engine/oracle/parser/OracleParserTest.java
deleted file mode 100644
index 67ea476dbe7..00000000000
---
a/parser/sql/engine/dialect/oracle/src/test/java/org/apache/shardingsphere/sql/parser/engine/oracle/parser/OracleParserTest.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.shardingsphere.sql.parser.engine.oracle.parser;
-
-import org.antlr.v4.runtime.BailErrorStrategy;
-import org.antlr.v4.runtime.BaseErrorListener;
-import org.antlr.v4.runtime.CharStreams;
-import org.antlr.v4.runtime.CommonTokenStream;
-import org.antlr.v4.runtime.RecognitionException;
-import org.antlr.v4.runtime.Recognizer;
-import org.antlr.v4.runtime.Token;
-import org.antlr.v4.runtime.TokenSource;
-import org.antlr.v4.runtime.atn.DecisionInfo;
-import org.antlr.v4.runtime.atn.PredictionMode;
-import org.antlr.v4.runtime.misc.ParseCancellationException;
-import org.junit.jupiter.api.parallel.Isolated;
-import org.junit.jupiter.params.ParameterizedTest;
-import org.junit.jupiter.params.provider.Arguments;
-import org.junit.jupiter.params.provider.MethodSource;
-
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.stream.Collectors;
-import java.util.stream.IntStream;
-import java.util.stream.Stream;
-
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.hamcrest.Matchers.is;
-import static org.hamcrest.Matchers.not;
-import static org.junit.jupiter.api.Assertions.assertNotNull;
-import static org.junit.jupiter.api.Assertions.assertThrows;
-import static org.junit.jupiter.api.Assertions.assertTrue;
-
-@Isolated("Measures cold and warm shared Oracle parser DFA caches")
-class OracleParserTest {
-
- private static final int MAX_ADAPTIVE_LOOKAHEAD = 16;
-
- @ParameterizedTest(name = "{0}")
- @MethodSource("concatenationArguments")
- void assertParseLongConcatenation(final String name, final String
expression, final int count, final boolean warm) {
- assertBoundedPrediction("SELECT " + String.join("||CHR(124)||",
Collections.nCopies(count, expression)) + " FROM foo_table", warm);
- }
-
- @ParameterizedTest(name = "{0}")
- @MethodSource("longProjectionArguments")
- void assertParseLongProjection(final String name, final String sql) {
- assertBoundedPrediction(sql, false);
- }
-
- private void assertBoundedPrediction(final String sql, final boolean warm)
{
- OracleParser parser = createParser(sql, PredictionMode.SLL);
- parser.getInterpreter().clearDFA();
- if (warm) {
- parser.parse();
- parser.reset();
- }
- parser.setProfile(true);
- assertNotNull(parser.parse());
- assertComplete(parser);
- DecisionInfo[] decisions = parser.getParseInfo().getDecisionInfo();
- assertTrue(Arrays.stream(decisions).allMatch(each -> each.SLL_MaxLook
<= MAX_ADAPTIVE_LOOKAHEAD), "Prediction scanned across concatenation operands");
- assertTrue(Arrays.stream(decisions).mapToLong(each ->
each.SLL_TotalLook).sum() <= (long) parser.getTokenStream().size() *
MAX_ADAPTIVE_LOOKAHEAD,
- "Total prediction work exceeded the linear token budget");
- }
-
- private static Stream<Arguments> concatenationArguments() {
- return Stream.of("foo_function(foo_column)",
"TO_CHAR(foo_column,'YYYY-MM-DD')", "foo_function(bar_function(foo_column))",
- "foo_schema.foo_function(foo_column)", "CAST(foo_column AS
VARCHAR2(20))")
- .flatMap(expression -> IntStream.of(24, 48,
96).boxed().flatMap(count -> Stream.of(false, true)
- .map(warm -> Arguments.of(expression + "/" + count +
(warm ? "/warm" : "/cold"), expression, count, warm))));
- }
-
- private static Stream<Arguments> longProjectionArguments() {
- String repeated = String.join("||CHR(124)||", Collections.nCopies(54,
"COL_VARCHAR2"));
- Collection<Integer> dateColumns = Arrays.asList(12, 17, 22, 38, 39,
40);
- String mixed = IntStream.range(0, 54).mapToObj(each ->
dateColumns.contains(each)
- ? "TO_CHAR(COL_" + each + ", 'YYYY-MM-DD HH24:MI:SS')"
- : "COL_" + each).collect(Collectors.joining("||CHR(124)||"));
- return Stream.of(Arguments.of("unaliased 54-field projection", "SELECT
" + repeated + " FROM foo_schema.foo_table WHERE id = 1 AND rownum < 2"),
- Arguments.of("aliased 54-field projection", "SELECT " +
repeated + " AS EXPORT_ROW FROM foo_schema.foo_table WHERE id = 1 AND rownum <
2"),
- Arguments.of("six TO_CHAR calls in 54 fields", "SELECT " +
mixed + " FROM foo_table WHERE id = 1 AND rownum < 2"));
- }
-
- @ParameterizedTest(name = "{0}")
- @MethodSource("validStatements")
- void assertParseExpressionBoundaries(final String name, final String sql,
final PredictionMode mode) {
- OracleParser parser = createParser(sql, mode);
- assertNotNull(parser.parse());
- assertComplete(parser);
- }
-
- private static Stream<Arguments> validStatements() {
- return sqlArguments(
- "FLASHBACK DATABASE TO TIMESTAMP SYSDATE-1",
- "FLASHBACK TABLE foo_table TO TIMESTAMP (SYSTIMESTAMP -
INTERVAL '1' MINUTE)",
- "SELECT s FROM foo_table MODEL DIMENSION BY (d) MEASURES (s)
RULES (s[1] = s[2] + (s[3] + 1))",
- "SELECT s FROM foo_table MODEL DIMENSION BY (d) MEASURES (s)
RULES (s[1] = s[2] / 2)",
- "BEGIN EXECUTE IMMEDIATE 'BEGIN NULL; END;' USING IN a, OUT b;
END;",
- "BEGIN OPEN foo_cursor(1,2); END;",
- "BEGIN FOR r IN foo_cursor(1,2) LOOP NULL; END LOOP; END;",
- "DECLARE v foo_record := foo_record(1,b=>2); BEGIN NULL; END;",
- "DECLARE v foo_record := foo_record(a=>1,b=>2); BEGIN NULL;
END;",
- "DECLARE v foo_record := foo_record(); BEGIN NULL; END;",
- "BEGIN FORALL i IN 1..2 INSERT INTO foo_table VALUES (v(i));
END;",
- "BEGIN FORALL i IN 1..2 UPDATE foo_table SET id = v(i); END;",
- "BEGIN FORALL i IN 1..2 DELETE FROM foo_table WHERE id = v(i);
END;",
- "BEGIN FORALL i IN 1..2 MERGE INTO foo_table t USING bar_table
s ON (t.id=s.id) WHEN MATCHED THEN UPDATE SET t.val=v(i); END;",
- "BEGIN FORALL i IN 1..v.COUNT SAVE EXCEPTIONS EXECUTE
IMMEDIATE 'DELETE FROM foo_table WHERE id=:1' USING v(i); END;");
- }
-
- @ParameterizedTest(name = "{0}")
- @MethodSource("invalidStatements")
- void assertRejectAdjacentExpressions(final String name, final String sql,
final PredictionMode mode) {
- assertThrows(ParseCancellationException.class, () -> createParser(sql,
mode).parse());
- }
-
- private static Stream<Arguments> invalidStatements() {
- return sqlArguments(
- "FLASHBACK DATABASE TO TIMESTAMP SYSDATE SYSDATE",
- "FLASHBACK DATABASE TO TIMESTAMP (SYSDATE",
- "SELECT s FROM foo_table MODEL DIMENSION BY (d) MEASURES (s)
RULES (s[1] = s[2] + 1 2)",
- "SELECT s FROM foo_table MODEL DIMENSION BY (d) MEASURES (s)
RULES (s[1] = s[2] +)",
- "SELECT s FROM foo_table MODEL DIMENSION BY (d) MEASURES (s)
RULES (s[1] = s[2] /)",
- "BEGIN EXECUTE IMMEDIATE 'BEGIN NULL; END;' USING a b; END;",
- "BEGIN EXECUTE IMMEDIATE 'BEGIN NULL; END;' USING IN a OUT b;
END;",
- "BEGIN OPEN foo_cursor(1 2); END;",
- "BEGIN FOR r IN foo_cursor(1 2) LOOP NULL; END LOOP; END;",
- "DECLARE v foo_record := foo_record(1 b=>2); BEGIN NULL; END;",
- "BEGIN FORALL i IN 1..v.COUNT 'DELETE FROM foo_table'; END;",
- "BEGIN FORALL i IN 1..v.COUNT (v(i)); END;");
- }
-
- @ParameterizedTest(name = "{0}")
- @MethodSource("validDynamicSql")
- void assertDynamicSqlArguments(final String name, final String sql, final
PredictionMode mode) {
- OracleParser parser = createParser(sql, mode);
- parser.dynamicSql();
- assertComplete(parser);
- }
-
- private static Stream<Arguments> validDynamicSql() {
- return sqlArguments("EXECUTE IMMEDIATE 'SELECT 1 FROM DUAL'", "EXECUTE
IMMEDIATE 'SELECT :a+:b FROM DUAL' USING IN a,b");
- }
-
- @ParameterizedTest(name = "{0}")
- @MethodSource("invalidDynamicSql")
- void assertRejectDynamicSqlArguments(final String name, final String sql,
final PredictionMode mode) {
- OracleParser parser = createParser(sql, mode);
- try {
- parser.dynamicSql();
- } catch (final ParseCancellationException ignored) {
- return;
- }
- assertThat(parser.getCurrentToken().getType(), not(Token.EOF));
- }
-
- private static Stream<Arguments> invalidDynamicSql() {
- return sqlArguments("EXECUTE IMMEDIATE 'SELECT :a+:b FROM DUAL' USING
a b", "EXECUTE IMMEDIATE 'SELECT 1 FROM DUAL' USING",
- "EXECUTE IMMEDIATE 'SELECT :a FROM DUAL' USING a,");
- }
-
- private static Stream<Arguments> sqlArguments(final String... sql) {
- return Arrays.stream(sql).flatMap(each ->
Stream.of(PredictionMode.SLL, PredictionMode.LL).map(mode -> Arguments.of(mode
+ ": " + each, each, mode)));
- }
-
- private OracleParser createParser(final String sql, final PredictionMode
mode) {
- OracleLexer lexer = new OracleLexer(CharStreams.fromString(sql));
- lexer.removeErrorListeners();
- lexer.addErrorListener(new BaseErrorListener() {
-
- @Override
- public void syntaxError(final Recognizer<?, ?> recognizer, final
Object offendingSymbol, final int line, final int charPositionInLine,
- final String msg, final
RecognitionException ex) {
- throw new ParseCancellationException(msg);
- }
- });
- OracleParser result = new OracleParser(new BoundedTokenStream(lexer,
sql.length() * 128));
- result.setErrorHandler(new BailErrorStrategy());
- result.removeErrorListeners();
- result.getInterpreter().setPredictionMode(mode);
- return result;
- }
-
- private void assertComplete(final OracleParser parser) {
- assertThat(parser.getNumberOfSyntaxErrors(), is(0));
- assertThat(parser.getCurrentToken().getType(), is(Token.EOF));
- }
-
- private static final class BoundedTokenStream extends CommonTokenStream {
-
- private final int maximumLookahead;
-
- private int lookaheadCount;
-
- private BoundedTokenStream(final TokenSource tokenSource, final int
maximumLookahead) {
- super(tokenSource);
- this.maximumLookahead = maximumLookahead;
- }
-
- @Override
- public Token LT(final int k) {
- if (++lookaheadCount > maximumLookahead) {
- throw new AssertionError("Token lookahead exceeded the linear
budget of " + maximumLookahead);
- }
- return super.LT(k);
- }
- }
-}