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 &amp; 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) &gt; 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>

Reply via email to