Skip to content

Commit ca5ddbb

Browse files
committed
Support parsing Oracle RMAN CHANGE SQL
* Add CHANGE BACKUPSET / DATAFILECOPY / COPY OF ARCHIVELOG SEQUENCE BETWEEN / BACKUP OF SPFILE TAG statements with AVAILABLE / UNAVAILABLE / NOKEEP qualifiers to the Oracle DAL grammar * Define BACKUPSET, DATAFILECOPY, AVAILABLE, UNAVAILABLE and TAG lexer tokens and register them in unreservedWord to keep identifier compatibility * Add OracleChangeStatement, visitor mapping and CHANGE visitor rule * Add 8 CHANGE parser IT cases and a BINARY_FLOAT / BINARY_DOUBLE create-table case Fixes #27016
1 parent 53f8ce5 commit ca5ddbb

15 files changed

Lines changed: 219 additions & 1 deletion

File tree

parser/sql/engine/core/src/main/java/org/apache/shardingsphere/sql/parser/engine/core/database/visitor/SQLVisitorRule.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -885,6 +885,8 @@ public enum SQLVisitorRule {
885885

886886
REPORT("Report", SQLStatementType.DAL),
887887

888+
CHANGE("Change", SQLStatementType.DAL),
889+
888890
START_REPLICA("StartReplica", SQLStatementType.DAL),
889891

890892
REFRESH("Refresh", SQLStatementType.DAL),

parser/sql/engine/dialect/oracle/src/main/antlr4/imports/oracle/BaseRule.g4

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

parser/sql/engine/dialect/oracle/src/main/antlr4/imports/oracle/DALStatement.g4

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -203,3 +203,16 @@ list
203203
report
204204
: REPORT SCHEMA forDbUniqueName?
205205
;
206+
207+
change
208+
: CHANGE BACKUPSET numberLiterals changeOption?
209+
| CHANGE DATAFILECOPY (stringLiterals | numberLiterals) changeOption?
210+
| CHANGE COPY OF ARCHIVELOG SEQUENCE BETWEEN numberLiterals AND numberLiterals changeOption?
211+
| CHANGE BACKUP OF SPFILE TAG (stringLiterals | DOUBLE_QUOTED_TEXT) changeOption?
212+
;
213+
214+
changeOption
215+
: AVAILABLE
216+
| UNAVAILABLE
217+
| NOKEEP
218+
;

parser/sql/engine/dialect/oracle/src/main/antlr4/imports/oracle/OracleKeyword.g4

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1599,6 +1599,14 @@ DATAFILE
15991599
: D A T A F I L E
16001600
;
16011601

1602+
DATAFILECOPY
1603+
: D A T A F I L E C O P Y
1604+
;
1605+
1606+
BACKUPSET
1607+
: B A C K U P S E T
1608+
;
1609+
16021610
MANAGED
16031611
: M A N A G E D
16041612
;
@@ -1679,6 +1687,18 @@ AVAILABILITY
16791687
: A V A I L A B I L I T Y
16801688
;
16811689

1690+
AVAILABLE
1691+
: A V A I L A B L E
1692+
;
1693+
1694+
UNAVAILABLE
1695+
: U N A V A I L A B L E
1696+
;
1697+
1698+
TAG
1699+
: T A G
1700+
;
1701+
16821702
PERFORMANCE
16831703
: P E R F O R M A N C E
16841704
;

parser/sql/engine/dialect/oracle/src/main/antlr4/org/apache/shardingsphere/sql/parser/autogen/OracleStatement.g4

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,7 @@ execute
166166
| set
167167
| list
168168
| report
169+
| change
169170
| createOperator
170171
| createIndexType
171172
| createSchema

parser/sql/engine/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/engine/oracle/visitor/statement/type/OracleDALStatementVisitor.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import org.apache.shardingsphere.sql.parser.api.ASTNode;
2222
import org.apache.shardingsphere.sql.parser.api.visitor.statement.type.DALStatementVisitor;
2323
import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.AlterResourceCostContext;
24+
import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.ChangeContext;
2425
import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.ExecuteContext;
2526
import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.ExplainContext;
2627
import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.ListContext;
@@ -37,6 +38,7 @@
3738
import org.apache.shardingsphere.sql.parser.statement.core.statement.type.dal.SetStatement;
3839
import org.apache.shardingsphere.sql.parser.statement.core.statement.type.dal.ShowStatement;
3940
import org.apache.shardingsphere.sql.parser.statement.oracle.dal.OracleAlterResourceCostStatement;
41+
import org.apache.shardingsphere.sql.parser.statement.oracle.dal.OracleChangeStatement;
4042
import org.apache.shardingsphere.sql.parser.statement.oracle.dal.OracleListStatement;
4143
import org.apache.shardingsphere.sql.parser.statement.oracle.dal.OracleReportStatement;
4244
import org.apache.shardingsphere.sql.parser.statement.oracle.dal.OracleSpoolStatement;
@@ -118,4 +120,9 @@ public ASTNode visitList(final ListContext ctx) {
118120
public ASTNode visitReport(final ReportContext ctx) {
119121
return new OracleReportStatement(getDatabaseType(), null == ctx.forDbUniqueName() ? null : ctx.forDbUniqueName().identifier().getText());
120122
}
123+
124+
@Override
125+
public ASTNode visitChange(final ChangeContext ctx) {
126+
return new OracleChangeStatement(getDatabaseType());
127+
}
121128
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
/*
2+
* Licensed to the Apache Software Foundation (ASF) under one or more
3+
* contributor license agreements. See the NOTICE file distributed with
4+
* this work for additional information regarding copyright ownership.
5+
* The ASF licenses this file to You under the Apache License, Version 2.0
6+
* (the "License"); you may not use this file except in compliance with
7+
* the License. You may obtain a copy of the License at
8+
*
9+
* http://www.apache.org/licenses/LICENSE-2.0
10+
*
11+
* Unless required by applicable law or agreed to in writing, software
12+
* distributed under the License is distributed on an "AS IS" BASIS,
13+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14+
* See the License for the specific language governing permissions and
15+
* limitations under the License.
16+
*/
17+
18+
package org.apache.shardingsphere.sql.parser.statement.oracle.dal;
19+
20+
import org.apache.shardingsphere.database.connector.core.type.DatabaseType;
21+
import org.apache.shardingsphere.sql.parser.statement.core.statement.type.dal.DALStatement;
22+
23+
/**
24+
* Change statement for Oracle.
25+
*/
26+
public final class OracleChangeStatement extends DALStatement {
27+
28+
public OracleChangeStatement(final DatabaseType databaseType) {
29+
super(databaseType);
30+
}
31+
}

test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/dal/dialect/oracle/OracleDALStatementAssert.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,14 +20,17 @@
2020
import lombok.AccessLevel;
2121
import lombok.NoArgsConstructor;
2222
import org.apache.shardingsphere.sql.parser.statement.core.statement.type.dal.DALStatement;
23+
import org.apache.shardingsphere.sql.parser.statement.oracle.dal.OracleChangeStatement;
2324
import org.apache.shardingsphere.sql.parser.statement.oracle.dal.OracleListStatement;
2425
import org.apache.shardingsphere.sql.parser.statement.oracle.dal.OracleReportStatement;
2526
import org.apache.shardingsphere.sql.parser.statement.oracle.dal.OracleSpoolStatement;
2627
import org.apache.shardingsphere.test.it.sql.parser.internal.asserts.SQLCaseAssertContext;
28+
import org.apache.shardingsphere.test.it.sql.parser.internal.asserts.statement.dal.dialect.oracle.type.OracleChangeStatementAssert;
2729
import org.apache.shardingsphere.test.it.sql.parser.internal.asserts.statement.dal.dialect.oracle.type.OracleListStatementAssert;
2830
import org.apache.shardingsphere.test.it.sql.parser.internal.asserts.statement.dal.dialect.oracle.type.OracleReportStatementAssert;
2931
import org.apache.shardingsphere.test.it.sql.parser.internal.asserts.statement.dal.dialect.oracle.type.OracleSpoolStatementAssert;
3032
import org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.SQLParserTestCase;
33+
import org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.statement.dal.dialect.oracle.OracleChangeStatementTestCase;
3134
import org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.statement.dal.dialect.oracle.OracleListStatementTestCase;
3235
import org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.statement.dal.dialect.oracle.OracleReportStatementTestCase;
3336
import org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.statement.dal.dialect.oracle.OracleSpoolStatementTestCase;
@@ -55,5 +58,8 @@ public static void assertIs(final SQLCaseAssertContext assertContext, final DALS
5558
if (actual instanceof OracleReportStatement) {
5659
OracleReportStatementAssert.assertIs(assertContext, (OracleReportStatement) actual, (OracleReportStatementTestCase) expected);
5760
}
61+
if (actual instanceof OracleChangeStatement) {
62+
OracleChangeStatementAssert.assertIs(assertContext, (OracleChangeStatement) actual, (OracleChangeStatementTestCase) expected);
63+
}
5864
}
5965
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
/*
2+
* Licensed to the Apache Software Foundation (ASF) under one or more
3+
* contributor license agreements. See the NOTICE file distributed with
4+
* this work for additional information regarding copyright ownership.
5+
* The ASF licenses this file to You under the Apache License, Version 2.0
6+
* (the "License"); you may not use this file except in compliance with
7+
* the License. You may obtain a copy of the License at
8+
*
9+
* http://www.apache.org/licenses/LICENSE-2.0
10+
*
11+
* Unless required by applicable law or agreed to in writing, software
12+
* distributed under the License is distributed on an "AS IS" BASIS,
13+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14+
* See the License for the specific language governing permissions and
15+
* limitations under the License.
16+
*/
17+
18+
package org.apache.shardingsphere.test.it.sql.parser.internal.asserts.statement.dal.dialect.oracle.type;
19+
20+
import lombok.AccessLevel;
21+
import lombok.NoArgsConstructor;
22+
import org.apache.shardingsphere.sql.parser.statement.oracle.dal.OracleChangeStatement;
23+
import org.apache.shardingsphere.test.it.sql.parser.internal.asserts.SQLCaseAssertContext;
24+
import org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.statement.dal.dialect.oracle.OracleChangeStatementTestCase;
25+
26+
/**
27+
* Oracle change statement assert for Oracle.
28+
*/
29+
@NoArgsConstructor(access = AccessLevel.PRIVATE)
30+
public final class OracleChangeStatementAssert {
31+
32+
/**
33+
* Assert change statement is correct with expected parser result.
34+
*
35+
* @param assertContext assert context
36+
* @param actual actual change statement
37+
* @param expected expected change statement test case
38+
*/
39+
public static void assertIs(final SQLCaseAssertContext assertContext, final OracleChangeStatement actual, final OracleChangeStatementTestCase expected) {
40+
}
41+
}

test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/RootSQLParserTestCases.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,7 @@
123123
import org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.statement.dal.dialect.mysql.table.MySQLChecksumTableStatementTestCase;
124124
import org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.statement.dal.dialect.mysql.table.MySQLOptimizeTableStatementTestCase;
125125
import org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.statement.dal.dialect.mysql.table.MySQLRepairTableStatementTestCase;
126+
import org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.statement.dal.dialect.oracle.OracleChangeStatementTestCase;
126127
import org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.statement.dal.dialect.oracle.OracleListStatementTestCase;
127128
import org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.statement.dal.dialect.oracle.OracleReportStatementTestCase;
128129
import org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.statement.dal.dialect.oracle.OracleSpoolStatementTestCase;
@@ -2120,6 +2121,9 @@ public final class RootSQLParserTestCases {
21202121
@XmlElement(name = "report")
21212122
private final List<OracleReportStatementTestCase> oracleReportStatementTestCases = new LinkedList<>();
21222123

2124+
@XmlElement(name = "change")
2125+
private final List<OracleChangeStatementTestCase> oracleChangeStatementTestCases = new LinkedList<>();
2126+
21232127
@XmlElement(name = "create-loadable-function")
21242128
private final List<MySQLCreateLoadableFunctionTestCase> createLoadableFunctionTestCases = new LinkedList<>();
21252129

0 commit comments

Comments
 (0)