This is an automated email from the ASF dual-hosted git repository.
duanzhengqiang 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 c9b94a3 support visit function for oracle (#13645)
c9b94a3 is described below
commit c9b94a32a9ce3d3896d4ec5e4dcc3b8e43dc4b6b
Author: tuichenchuxin <[email protected]>
AuthorDate: Tue Nov 16 19:40:15 2021 +0800
support visit function for oracle (#13645)
---
.../impl/OracleDMLStatementSQLVisitor.java | 19 ++++----
.../statement/impl/OracleStatementSQLVisitor.java | 19 +++++---
.../src/main/resources/case/dml/delete.xml | 6 ++-
.../main/resources/case/dml/select-expression.xml | 56 ++++++++++++++++++++++
.../sql/supported/dml/select-expression.xml | 1 +
5 files changed, 86 insertions(+), 15 deletions(-)
diff --git
a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/statement/impl/OracleDMLStatementSQLVisitor.java
b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/statement/impl/OracleDMLStatementSQLVisitor.java
index 7b173b1..1c14a2d 100644
---
a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/statement/impl/OracleDMLStatementSQLVisitor.java
+++
b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/statement/impl/OracleDMLStatementSQLVisitor.java
@@ -109,6 +109,7 @@ import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.column.Column
import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.column.InsertColumnsSegment;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.BinaryOperationExpression;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.ExpressionSegment;
+import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.FunctionSegment;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.complex.CommonExpressionSegment;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.complex.CommonTableExpressionSegment;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.simple.LiteralExpressionSegment;
@@ -713,6 +714,12 @@ public final class OracleDMLStatementSQLVisitor extends
OracleStatementSQLVisito
((ExpressionProjectionSegment) projection).setAlias(alias);
return projection;
}
+ if (projection instanceof FunctionSegment) {
+ FunctionSegment segment = (FunctionSegment) projection;
+ ExpressionProjectionSegment result = new
ExpressionProjectionSegment(segment.getStartIndex(), segment.getStopIndex(),
segment.getText(), segment);
+ result.setAlias(alias);
+ return result;
+ }
if (projection instanceof CommonExpressionSegment) {
CommonExpressionSegment segment = (CommonExpressionSegment)
projection;
ExpressionProjectionSegment result = new
ExpressionProjectionSegment(segment.getStartIndex(), segment.getStopIndex(),
segment.getText());
@@ -910,8 +917,7 @@ public final class OracleDMLStatementSQLVisitor extends
OracleStatementSQLVisito
for (GroupByItemContext each : ctx.groupByItem()) {
items.addAll(generateOrderByItemsFromGroupByItem(each));
}
- GroupBySegment result = new
GroupBySegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(),
items);
- return result;
+ return new GroupBySegment(ctx.getStart().getStartIndex(),
ctx.getStop().getStopIndex(), items);
}
private Collection<OrderByItemSegment>
generateOrderByItemsFromGroupByItem(final GroupByItemContext ctx) {
@@ -931,17 +937,14 @@ public final class OracleDMLStatementSQLVisitor extends
OracleStatementSQLVisito
ASTNode expression = visit(ctx);
if (expression instanceof ColumnSegment) {
ColumnSegment column = (ColumnSegment) expression;
- ColumnOrderByItemSegment result = new
ColumnOrderByItemSegment(column, OrderDirection.ASC);
- return result;
+ return new ColumnOrderByItemSegment(column, OrderDirection.ASC);
}
if (expression instanceof LiteralExpressionSegment) {
LiteralExpressionSegment literalExpression =
(LiteralExpressionSegment) expression;
- IndexOrderByItemSegment result = new
IndexOrderByItemSegment(literalExpression.getStartIndex(),
literalExpression.getStopIndex(),
+ return new
IndexOrderByItemSegment(literalExpression.getStartIndex(),
literalExpression.getStopIndex(),
SQLUtil.getExactlyNumber(literalExpression.getLiterals().toString(),
10).intValue(), OrderDirection.ASC);
- return result;
}
- ExpressionOrderByItemSegment result = new
ExpressionOrderByItemSegment(ctx.getStart().getStartIndex(),
ctx.getStop().getStopIndex(), ctx.getText(), OrderDirection.ASC);
- return result;
+ return new
ExpressionOrderByItemSegment(ctx.getStart().getStartIndex(),
ctx.getStop().getStopIndex(), ctx.getText(), OrderDirection.ASC,
(ExpressionSegment) expression);
}
private Collection<OrderByItemSegment>
generateOrderByItemSegmentsFromRollupCubeClause(final RollupCubeClauseContext
ctx) {
diff --git
a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/statement/impl/OracleStatementSQLVisitor.java
b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/statement/impl/OracleStatementSQLVisitor.java
index 55110e6..4763f1e 100644
---
a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/statement/impl/OracleStatementSQLVisitor.java
+++
b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/statement/impl/OracleStatementSQLVisitor.java
@@ -115,6 +115,7 @@ import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import java.util.Properties;
+import java.util.stream.Collectors;
/**
* Oracle Statement SQL visitor.
@@ -491,25 +492,30 @@ public abstract class OracleStatementSQLVisitor extends
OracleStatementBaseVisit
if (null != ctx.castFunction()) {
return visit(ctx.castFunction());
}
- return new ExpressionProjectionSegment(ctx.getStart().getStartIndex(),
ctx.getStop().getStopIndex(), getOriginalText(ctx));
+ if (null != ctx.charFunction()) {
+ return visit(ctx.charFunction());
+ }
+ return new FunctionSegment(ctx.getStart().getStartIndex(),
ctx.getStop().getStopIndex(), ctx.getChild(0).getChild(0).getText(),
getOriginalText(ctx));
}
@Override
public final ASTNode visitCastFunction(final CastFunctionContext ctx) {
calculateParameterCount(Collections.singleton(ctx.expr()));
- return new ExpressionProjectionSegment(ctx.getStart().getStartIndex(),
ctx.getStop().getStopIndex(), getOriginalText(ctx));
+ return new FunctionSegment(ctx.getStart().getStartIndex(),
ctx.getStop().getStopIndex(), ctx.CAST().getText(), getOriginalText(ctx));
}
@Override
public final ASTNode visitCharFunction(final CharFunctionContext ctx) {
calculateParameterCount(ctx.expr());
- return new ExpressionProjectionSegment(ctx.getStart().getStartIndex(),
ctx.getStop().getStopIndex(), getOriginalText(ctx));
+ return new FunctionSegment(ctx.getStart().getStartIndex(),
ctx.getStop().getStopIndex(), ctx.CHAR().getText(), getOriginalText(ctx));
}
@Override
public final ASTNode visitRegularFunction(final RegularFunctionContext
ctx) {
- calculateParameterCount(ctx.expr());
- return new ExpressionProjectionSegment(ctx.getStart().getStartIndex(),
ctx.getStop().getStopIndex(), getOriginalText(ctx));
+ FunctionSegment result = new
FunctionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(),
ctx.regularFunctionName().getText(), getOriginalText(ctx));
+ Collection<ExpressionSegment> expressionSegments =
ctx.expr().stream().map(each -> (ExpressionSegment)
visit(each)).collect(Collectors.toList());
+ result.getParameters().addAll(expressionSegments);
+ return result;
}
@Override
@@ -548,7 +554,8 @@ public abstract class OracleStatementSQLVisitor extends
OracleStatementBaseVisit
return new
IndexOrderByItemSegment(ctx.numberLiterals().getStart().getStartIndex(),
ctx.numberLiterals().getStop().getStopIndex(),
SQLUtil.getExactlyNumber(ctx.numberLiterals().getText(),
10).intValue(), orderDirection);
}
- return new
ExpressionOrderByItemSegment(ctx.expr().getStart().getStartIndex(),
ctx.expr().getStop().getStopIndex(), ctx.expr().getText(), orderDirection);
+ return new
ExpressionOrderByItemSegment(ctx.expr().getStart().getStartIndex(),
ctx.expr().getStop().getStopIndex(),
+ ctx.expr().getText(), orderDirection, (ExpressionSegment)
visit(ctx.expr()));
}
@Override
diff --git
a/shardingsphere-test/shardingsphere-parser-test/src/main/resources/case/dml/delete.xml
b/shardingsphere-test/shardingsphere-parser-test/src/main/resources/case/dml/delete.xml
index ae91987..1ad0f78 100644
---
a/shardingsphere-test/shardingsphere-parser-test/src/main/resources/case/dml/delete.xml
+++
b/shardingsphere-test/shardingsphere-parser-test/src/main/resources/case/dml/delete.xml
@@ -647,7 +647,11 @@
</left>
<operator>+</operator>
<right>
- <expression-projection
text="TO_YMINTERVAL('01-00')" start-index="62" stop-index="83"/>
+ <function
function-name="TO_YMINTERVAL" text="TO_YMINTERVAL('01-00')" start-index="62"
stop-index="83">
+ <parameter>
+ <literal-expression
value="01-00" start-index="76" stop-index="82"/>
+ </parameter>
+ </function>
</right>
</binary-operation-expression>
</left>
diff --git
a/shardingsphere-test/shardingsphere-parser-test/src/main/resources/case/dml/select-expression.xml
b/shardingsphere-test/shardingsphere-parser-test/src/main/resources/case/dml/select-expression.xml
index 5a7f380..c51f71e 100644
---
a/shardingsphere-test/shardingsphere-parser-test/src/main/resources/case/dml/select-expression.xml
+++
b/shardingsphere-test/shardingsphere-parser-test/src/main/resources/case/dml/select-expression.xml
@@ -1828,4 +1828,60 @@
<expression-projection text="1 | 1" start-index="7"
stop-index="11"/>
</projections>
</select>
+
+ <select sql-case-id="select_with_abs_function">
+ <from>
+ <simple-table name="t_order" start-index="19" stop-index="25" />
+ </from>
+ <projections start-index="7" stop-index="12">
+ <expression-projection text="ABS(1)" start-index="7"
stop-index="12">
+ <expr>
+ <function function-name="ABS" text="ABS(1)"
start-index="7" stop-index="12">
+ <parameter>
+ <literal-expression value="1" start-index="11"
stop-index="11"/>
+ </parameter>
+ </function>
+ </expr>
+ </expression-projection>
+ </projections>
+ <where start-index="27" stop-index="42">
+ <expr>
+ <binary-operation-expression start-index="33" stop-index="42">
+ <left>
+ <function function-name="ABS" text="ABS(1)"
start-index="33" stop-index="38">
+ <parameter>
+ <literal-expression value="1" start-index="37"
stop-index="37"/>
+ </parameter>
+ </function>
+ </left>
+ <operator>></operator>
+ <right>
+ <literal-expression value="1" start-index="42"
stop-index="42" />
+ </right>
+ </binary-operation-expression>
+ </expr>
+ </where>
+ <group-by>
+ <expression-item expression="ABS(1)" start-index="53"
stop-index="58">
+ <expr>
+ <function function-name="ABS" text="ABS(1)"
start-index="53" stop-index="58">
+ <parameter>
+ <literal-expression value="1" start-index="57"
stop-index="57"/>
+ </parameter>
+ </function>
+ </expr>
+ </expression-item>
+ </group-by>
+ <order-by>
+ <expression-item expression="ABS(1)" start-index="69"
stop-index="74">
+ <expr>
+ <function function-name="ABS" text="ABS(1)"
start-index="69" stop-index="74">
+ <parameter>
+ <literal-expression value="1" start-index="73"
stop-index="73"/>
+ </parameter>
+ </function>
+ </expr>
+ </expression-item>
+ </order-by>
+ </select>
</sql-parser-test-cases>
diff --git
a/shardingsphere-test/shardingsphere-parser-test/src/main/resources/sql/supported/dml/select-expression.xml
b/shardingsphere-test/shardingsphere-parser-test/src/main/resources/sql/supported/dml/select-expression.xml
index 0c1231c..752b345 100644
---
a/shardingsphere-test/shardingsphere-parser-test/src/main/resources/sql/supported/dml/select-expression.xml
+++
b/shardingsphere-test/shardingsphere-parser-test/src/main/resources/sql/supported/dml/select-expression.xml
@@ -82,4 +82,5 @@
<sql-case id="select_projections_with_expr" value="SELECT 10+20,CASE
order_id WHEN 1 THEN '11' ELSE '00' END,1 FROM t_order" db-types="MySQL"/>
<sql-case id="select_with_amp" value="select 1 & 1"
db-types="PostgreSQL,openGauss" />
<sql-case id="select_with_vertical_bar" value="select 1 | 1"
db-types="PostgreSQL,openGauss" />
+ <sql-case id="select_with_abs_function" value="SELECT ABS(1) FROM t_order
WHERE ABS(1) > 1 GROUP BY ABS(1) ORDER BY ABS(1)" db-types="MySQL,Oracle" />
</sql-cases>