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 8dd4c3e887e Extract columns from create index (#27579)
8dd4c3e887e is described below

commit 8dd4c3e887ea2a69fa16b8ebb97096ddb291d740
Author: ZhangCheng <[email protected]>
AuthorDate: Mon Jul 31 14:52:50 2023 +0800

    Extract columns from create index (#27579)
    
    * Extract columns from create index
    
    * Extract columns from create index
    
    * Extract columns from create index
    
    * Extract columns from create index
---
 .../type/OpenGaussDDLStatementVisitor.java         | 31 ++++++++++++++++++++++
 .../statement/type/OracleDDLStatementVisitor.java  |  7 +++++
 .../type/PostgreSQLDDLStatementVisitor.java        | 31 ++++++++++++++++++++++
 .../src/main/resources/case/ddl/create-index.xml   |  3 +++
 4 files changed, 72 insertions(+)

diff --git 
a/parser/sql/dialect/opengauss/src/main/java/org/apache/shardingsphere/sql/parser/opengauss/visitor/statement/type/OpenGaussDDLStatementVisitor.java
 
b/parser/sql/dialect/opengauss/src/main/java/org/apache/shardingsphere/sql/parser/opengauss/visitor/statement/type/OpenGaussDDLStatementVisitor.java
index 5586241bc55..4a63ec40777 100644
--- 
a/parser/sql/dialect/opengauss/src/main/java/org/apache/shardingsphere/sql/parser/opengauss/visitor/statement/type/OpenGaussDDLStatementVisitor.java
+++ 
b/parser/sql/dialect/opengauss/src/main/java/org/apache/shardingsphere/sql/parser/opengauss/visitor/statement/type/OpenGaussDDLStatementVisitor.java
@@ -113,6 +113,8 @@ import 
org.apache.shardingsphere.sql.parser.autogen.OpenGaussStatementParser.Fir
 import 
org.apache.shardingsphere.sql.parser.autogen.OpenGaussStatementParser.ForwardAllContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OpenGaussStatementParser.ForwardContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OpenGaussStatementParser.ForwardCountContext;
+import 
org.apache.shardingsphere.sql.parser.autogen.OpenGaussStatementParser.FuncArgExprContext;
+import 
org.apache.shardingsphere.sql.parser.autogen.OpenGaussStatementParser.FunctionExprWindowlessContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OpenGaussStatementParser.IndexElemContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OpenGaussStatementParser.IndexNameContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OpenGaussStatementParser.IndexNamesContext;
@@ -156,6 +158,8 @@ import 
org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.index.IndexNa
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.index.IndexSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.table.RenameTableDefinitionSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.column.ColumnSegment;
+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.generic.DataTypeSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.NameSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.OwnerSegment;
@@ -242,6 +246,7 @@ import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.opengauss.ddl.
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.opengauss.ddl.OpenGaussPrepareStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.opengauss.ddl.OpenGaussTruncateStatement;
 
+import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Iterator;
@@ -529,6 +534,32 @@ public final class OpenGaussDDLStatementVisitor extends 
OpenGaussStatementVisito
             if (null != each.colId()) {
                 result.getValue().add(new 
ColumnSegment(each.colId().start.getStartIndex(), 
each.colId().stop.getStopIndex(), new IdentifierValue(each.colId().getText())));
             }
+            if (null != each.functionExprWindowless()) {
+                FunctionSegment functionSegment = (FunctionSegment) 
visit(each.functionExprWindowless());
+                functionSegment.getParameters().forEach(param -> {
+                    if (param instanceof ColumnSegment) {
+                        result.getValue().add((ColumnSegment) param);
+                    }
+                });
+            }
+        }
+        return result;
+    }
+    
+    @Override
+    public ASTNode visitFunctionExprWindowless(final 
FunctionExprWindowlessContext ctx) {
+        FunctionSegment result = new 
FunctionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), 
ctx.funcApplication().funcName().getText(), getOriginalText(ctx));
+        
result.getParameters().addAll(getExpressions(ctx.funcApplication().funcArgList().funcArgExpr()));
+        return result;
+    }
+    
+    private Collection<ExpressionSegment> getExpressions(final 
Collection<FuncArgExprContext> aExprContexts) {
+        if (null == aExprContexts) {
+            return Collections.emptyList();
+        }
+        Collection<ExpressionSegment> result = new 
ArrayList<>(aExprContexts.size());
+        for (FuncArgExprContext each : aExprContexts) {
+            result.add((ExpressionSegment) visit(each.aExpr()));
         }
         return result;
     }
diff --git 
a/parser/sql/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/statement/type/OracleDDLStatementVisitor.java
 
b/parser/sql/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/statement/type/OracleDDLStatementVisitor.java
index 19f8688cd48..0cff1970570 100644
--- 
a/parser/sql/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/statement/type/OracleDDLStatementVisitor.java
+++ 
b/parser/sql/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/statement/type/OracleDDLStatementVisitor.java
@@ -601,6 +601,13 @@ public final class OracleDDLStatementVisitor extends 
OracleStatementVisitor impl
             if (astNode instanceof ColumnSegment) {
                 result.getValue().add((ColumnSegment) astNode);
             }
+            if (astNode instanceof FunctionSegment) {
+                ((FunctionSegment) astNode).getParameters().forEach(parameter 
-> {
+                    if (parameter instanceof ColumnSegment) {
+                        result.getValue().add((ColumnSegment) parameter);
+                    }
+                });
+            }
         }
         return result;
     }
diff --git 
a/parser/sql/dialect/postgresql/src/main/java/org/apache/shardingsphere/sql/parser/postgresql/visitor/statement/type/PostgreSQLDDLStatementVisitor.java
 
b/parser/sql/dialect/postgresql/src/main/java/org/apache/shardingsphere/sql/parser/postgresql/visitor/statement/type/PostgreSQLDDLStatementVisitor.java
index 5a2ba04d303..b7077430c17 100644
--- 
a/parser/sql/dialect/postgresql/src/main/java/org/apache/shardingsphere/sql/parser/postgresql/visitor/statement/type/PostgreSQLDDLStatementVisitor.java
+++ 
b/parser/sql/dialect/postgresql/src/main/java/org/apache/shardingsphere/sql/parser/postgresql/visitor/statement/type/PostgreSQLDDLStatementVisitor.java
@@ -144,6 +144,8 @@ import 
org.apache.shardingsphere.sql.parser.autogen.PostgreSQLStatementParser.Fi
 import 
org.apache.shardingsphere.sql.parser.autogen.PostgreSQLStatementParser.ForwardAllContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.PostgreSQLStatementParser.ForwardContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.PostgreSQLStatementParser.ForwardCountContext;
+import 
org.apache.shardingsphere.sql.parser.autogen.PostgreSQLStatementParser.FuncArgExprContext;
+import 
org.apache.shardingsphere.sql.parser.autogen.PostgreSQLStatementParser.FunctionExprWindowlessContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.PostgreSQLStatementParser.IndexElemContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.PostgreSQLStatementParser.IndexNameContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.PostgreSQLStatementParser.IndexNamesContext;
@@ -193,6 +195,8 @@ import 
org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.index.IndexNa
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.index.IndexSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.table.RenameTableDefinitionSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.column.ColumnSegment;
+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.generic.DataTypeSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.NameSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.OwnerSegment;
@@ -315,6 +319,7 @@ import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.postgresql.ddl
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.postgresql.ddl.PostgreSQLTruncateStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.postgresql.ddl.PostgreSQLUnlistenStatement;
 
+import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Iterator;
@@ -667,6 +672,32 @@ public final class PostgreSQLDDLStatementVisitor extends 
PostgreSQLStatementVisi
             if (null != each.colId()) {
                 result.getValue().add(new 
ColumnSegment(each.colId().start.getStartIndex(), 
each.colId().stop.getStopIndex(), new IdentifierValue(each.colId().getText())));
             }
+            if (null != each.functionExprWindowless()) {
+                FunctionSegment functionSegment = (FunctionSegment) 
visit(each.functionExprWindowless());
+                functionSegment.getParameters().forEach(param -> {
+                    if (param instanceof ColumnSegment) {
+                        result.getValue().add((ColumnSegment) param);
+                    }
+                });
+            }
+        }
+        return result;
+    }
+    
+    @Override
+    public ASTNode visitFunctionExprWindowless(final 
FunctionExprWindowlessContext ctx) {
+        FunctionSegment result = new 
FunctionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), 
ctx.funcApplication().funcName().getText(), getOriginalText(ctx));
+        
result.getParameters().addAll(getExpressions(ctx.funcApplication().funcArgList().funcArgExpr()));
+        return result;
+    }
+    
+    private Collection<ExpressionSegment> getExpressions(final 
Collection<FuncArgExprContext> aExprContexts) {
+        if (null == aExprContexts) {
+            return Collections.emptyList();
+        }
+        Collection<ExpressionSegment> result = new 
ArrayList<>(aExprContexts.size());
+        for (FuncArgExprContext each : aExprContexts) {
+            result.add((ExpressionSegment) visit(each.aExpr()));
         }
         return result;
     }
diff --git a/test/it/parser/src/main/resources/case/ddl/create-index.xml 
b/test/it/parser/src/main/resources/case/ddl/create-index.xml
index a3ba9712c4c..76622e923cd 100644
--- a/test/it/parser/src/main/resources/case/ddl/create-index.xml
+++ b/test/it/parser/src/main/resources/case/ddl/create-index.xml
@@ -114,6 +114,7 @@
             <simple-table name="t_order" start-index="33" stop-index="39" />
         </table>
         <index name="idx_upper_status" start-index="13" stop-index="28" />
+        <column name="status" start-index="48" stop-index="53" 
literal-start-index="48" literal-stop-index="53" />
     </create-index>
     
     <create-index sql-case-id="create_index_with_double_quota">
@@ -221,6 +222,8 @@
         <table>
             <simple-table name="t_order" start-index="25" stop-index="31" />
         </table>
+        <column name="location" start-index="51" stop-index="58" 
literal-start-index="51" literal-stop-index="58" />
+        <column name="location" start-index="60" stop-index="67" 
literal-start-index="60" literal-stop-index="67" />
     </create-index>
 
     <create-index sql-case-id="create_index_with_concurrently">

Reply via email to