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 e3e19d5 support visit function for sqlserver/sql92 (#13654)
e3e19d5 is described below
commit e3e19d50bb99d8ccbaed0e78b84c144b194a09f9
Author: tuichenchuxin <[email protected]>
AuthorDate: Wed Nov 17 13:59:12 2021 +0800
support visit function for sqlserver/sql92 (#13654)
---
.../impl/SQL92DMLStatementSQLVisitor.java | 7 ++
.../statement/impl/SQL92StatementSQLVisitor.java | 12 ++-
.../impl/SQLServerStatementSQLVisitor.java | 26 +++++--
.../main/resources/case/dml/select-expression.xml | 90 ++++++++++++++++++++++
.../sql/supported/dml/select-expression.xml | 2 +
5 files changed, 127 insertions(+), 10 deletions(-)
diff --git
a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sql92/src/main/java/org/apache/shardingsphere/sql/parser/sql92/visitor/statement/impl/SQL92DMLStatementSQLVisitor.java
b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sql92/src/main/java/org/apache/shardingsphere/sql/parser/sql92/visitor/statement/impl/SQL92DMLStatementSQLVisitor.java
index cb18b76..0ce2343 100644
---
a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sql92/src/main/java/org/apache/shardingsphere/sql/parser/sql92/visitor/statement/impl/SQL92DMLStatementSQLVisitor.java
+++
b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sql92/src/main/java/org/apache/shardingsphere/sql/parser/sql92/visitor/statement/impl/SQL92DMLStatementSQLVisitor.java
@@ -63,6 +63,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.simple.LiteralExpressionSegment;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.simple.ParameterMarkerExpressionSegment;
@@ -318,6 +319,12 @@ public final class SQL92DMLStatementSQLVisitor extends
SQL92StatementSQLVisitor
((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());
diff --git
a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sql92/src/main/java/org/apache/shardingsphere/sql/parser/sql92/visitor/statement/impl/SQL92StatementSQLVisitor.java
b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sql92/src/main/java/org/apache/shardingsphere/sql/parser/sql92/visitor/statement/impl/SQL92StatementSQLVisitor.java
index 0162d2f..e43ee53 100644
---
a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sql92/src/main/java/org/apache/shardingsphere/sql/parser/sql92/visitor/statement/impl/SQL92StatementSQLVisitor.java
+++
b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sql92/src/main/java/org/apache/shardingsphere/sql/parser/sql92/visitor/statement/impl/SQL92StatementSQLVisitor.java
@@ -64,6 +64,7 @@ import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.column.Column
import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.BetweenExpression;
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.InExpression;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.ListExpression;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.NotExpression;
@@ -100,6 +101,7 @@ import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import java.util.Properties;
+import java.util.stream.Collectors;
/**
* SQL92 Statement SQL visitor.
@@ -435,19 +437,21 @@ public abstract class SQL92StatementSQLVisitor extends
SQL92StatementBaseVisitor
if (null != ctx.castFunction()) {
return visit(ctx.castFunction());
}
- return new ExpressionProjectionSegment(ctx.getStart().getStartIndex(),
ctx.getStop().getStopIndex(), getOriginalText(ctx));
+ 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 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
diff --git
a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/sqlserver/visitor/statement/impl/SQLServerStatementSQLVisitor.java
b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/sqlserver/visitor/statement/impl/SQLServerStatementSQLVisitor.java
index 9049a0d..721e59d 100644
---
a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/sqlserver/visitor/statement/impl/SQLServerStatementSQLVisitor.java
+++
b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/sqlserver/visitor/statement/impl/SQLServerStatementSQLVisitor.java
@@ -107,6 +107,7 @@ import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.column.Insert
import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.BetweenExpression;
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.InExpression;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.ListExpression;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.NotExpression;
@@ -171,6 +172,7 @@ import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import java.util.Properties;
+import java.util.stream.Collectors;
/**
* Statement SQL SQLServer visitor.
@@ -535,25 +537,30 @@ public abstract class SQLServerStatementSQLVisitor
extends SQLServerStatementBas
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
@@ -579,7 +586,8 @@ public abstract class SQLServerStatementSQLVisitor extends
SQLServerStatementBas
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
@@ -1049,6 +1057,12 @@ public abstract class SQLServerStatementSQLVisitor
extends SQLServerStatementBas
((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());
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 c51f71e..6882982 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
@@ -1884,4 +1884,94 @@
</expression-item>
</order-by>
</select>
+
+ <select sql-case-id="select_with_regular_function">
+ <from>
+ <simple-table name="t_order" start-index="17" stop-index="23" />
+ </from>
+ <projections start-index="7" stop-index="10">
+ <expression-projection text="A(1)" start-index="7" stop-index="10">
+ <expr>
+ <function function-name="A" text="A(1)" start-index="7"
stop-index="10">
+ <parameter>
+ <literal-expression value="1" start-index="9"
stop-index="9"/>
+ </parameter>
+ </function>
+ </expr>
+ </expression-projection>
+ </projections>
+ <where start-index="25" stop-index="38">
+ <expr>
+ <binary-operation-expression start-index="31" stop-index="38">
+ <left>
+ <function function-name="A" text="A(1)"
start-index="31" stop-index="34">
+ <parameter>
+ <literal-expression value="1" start-index="33"
stop-index="33"/>
+ </parameter>
+ </function>
+ </left>
+ <operator>=</operator>
+ <right>
+ <literal-expression value="1" start-index="38"
stop-index="38" />
+ </right>
+ </binary-operation-expression>
+ </expr>
+ </where>
+ <group-by>
+ <expression-item expression="A(order_id)" start-index="49"
stop-index="59">
+ <expr>
+ <function function-name="A" text="A(order_id)"
start-index="49" stop-index="59">
+ <parameter>
+ <column name="order_id" start-index="51"
stop-index="58" />
+ </parameter>
+ </function>
+ </expr>
+ </expression-item>
+ </group-by>
+ <order-by>
+ <expression-item expression="A(order_id)" start-index="70"
stop-index="80">
+ <expr>
+ <function function-name="A" text="A(order_id)"
start-index="70" stop-index="80">
+ <parameter>
+ <column name="order_id" start-index="72"
stop-index="79" />
+ </parameter>
+ </function>
+ </expr>
+ </expression-item>
+ </order-by>
+ </select>
+
+ <select sql-case-id="select_with_regular_function_for_sql92">
+ <from>
+ <simple-table name="t_order" start-index="17" stop-index="23" />
+ </from>
+ <projections start-index="7" stop-index="10">
+ <expression-projection text="A(1)" start-index="7" stop-index="10">
+ <expr>
+ <function function-name="A" text="A(1)" start-index="7"
stop-index="10">
+ <parameter>
+ <literal-expression value="1" start-index="9"
stop-index="9"/>
+ </parameter>
+ </function>
+ </expr>
+ </expression-projection>
+ </projections>
+ <where start-index="25" stop-index="38">
+ <expr>
+ <binary-operation-expression start-index="31" stop-index="38">
+ <left>
+ <function function-name="A" text="A(1)"
start-index="31" stop-index="34">
+ <parameter>
+ <literal-expression value="1" start-index="33"
stop-index="33"/>
+ </parameter>
+ </function>
+ </left>
+ <operator>=</operator>
+ <right>
+ <literal-expression value="1" start-index="38"
stop-index="38" />
+ </right>
+ </binary-operation-expression>
+ </expr>
+ </where>
+ </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 752b345..45b94d1 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
@@ -83,4 +83,6 @@
<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-case id="select_with_regular_function" value="SELECT A(1) FROM
t_order WHERE A(1) = 1 GROUP BY A(order_id) ORDER BY A(order_id)"
db-types="MySQL,Oracle,SQLServer" />
+ <sql-case id="select_with_regular_function_for_sql92" value="SELECT A(1)
FROM t_order WHERE A(1) = 1" db-types="MySQL,Oracle,SQLServer,H2,SQL92" />
</sql-cases>