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">