You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by ch...@apache.org on 2026/10/19 03:55:46 UTC
(shardingsphere) branch master updated: Remove OracleParserTest (#40234)
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 <ia...@gmail.com>
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);
- }
- }
-}