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 304ee31 Add ExpressionProjectionSegment field (#11394)
304ee31 is described below
commit 304ee31241da580b1eea7543a86978bd7672a6c6
Author: tuichenchuxin <[email protected]>
AuthorDate: Tue Jul 20 11:09:39 2021 +0800
Add ExpressionProjectionSegment field (#11394)
* Add ExpressionProjectionSegment field
Change orderByItemExpressionSegment Assert location
Add test case
* Add ExpressionProjectionSegment field
Change orderByItemExpressionSegment Assert location
Add test case
---
.../statement/impl/MySQLStatementSQLVisitor.java | 10 +++----
.../dml/item/ExpressionProjectionSegment.java | 11 ++++++++
.../asserts/segment/orderby/OrderByItemAssert.java | 6 ++---
.../segment/projection/ProjectionAssert.java | 4 +++
.../expression/ExpectedExpressionProjection.java | 5 ++++
.../main/resources/case/dml/select-expression.xml | 31 ++++++++++++++++++++++
.../sql/supported/dml/select-expression.xml | 1 +
7 files changed, 60 insertions(+), 8 deletions(-)
diff --git
a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/impl/MySQLStatementSQLVisitor.java
b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/impl/MySQLStatementSQLVisitor.java
index 2cf0319..6b66755 100644
---
a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/impl/MySQLStatementSQLVisitor.java
+++
b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/impl/MySQLStatementSQLVisitor.java
@@ -1254,13 +1254,13 @@ public abstract class MySQLStatementSQLVisitor extends
MySQLStatementBaseVisitor
}
if (projection instanceof CommonExpressionSegment) {
CommonExpressionSegment segment = (CommonExpressionSegment)
projection;
- ExpressionProjectionSegment result = new
ExpressionProjectionSegment(segment.getStartIndex(), segment.getStopIndex(),
segment.getText());
+ ExpressionProjectionSegment result = new
ExpressionProjectionSegment(segment.getStartIndex(), segment.getStopIndex(),
segment.getText(), segment);
result.setAlias(alias);
return result;
}
// FIXME :For DISTINCT()
if (projection instanceof ColumnSegment) {
- ExpressionProjectionSegment result = new
ExpressionProjectionSegment(ctx.start.getStartIndex(), ctx.stop.getStopIndex(),
ctx.getText());
+ ExpressionProjectionSegment result = new
ExpressionProjectionSegment(ctx.start.getStartIndex(), ctx.stop.getStopIndex(),
ctx.getText(), (ColumnSegment) projection);
result.setAlias(alias);
return result;
}
@@ -1274,7 +1274,7 @@ public abstract class MySQLStatementSQLVisitor extends
MySQLStatementBaseVisitor
if (projection instanceof BinaryOperationExpression) {
int startIndex = ((BinaryOperationExpression)
projection).getStartIndex();
int stopIndex = null != alias ? alias.getStopIndex() :
((BinaryOperationExpression) projection).getStopIndex();
- ExpressionProjectionSegment result = new
ExpressionProjectionSegment(startIndex, stopIndex, ((BinaryOperationExpression)
projection).getText());
+ ExpressionProjectionSegment result = new
ExpressionProjectionSegment(startIndex, stopIndex, ((BinaryOperationExpression)
projection).getText(), (BinaryOperationExpression) projection);
result.setAlias(alias);
return result;
}
@@ -1282,8 +1282,8 @@ public abstract class MySQLStatementSQLVisitor extends
MySQLStatementBaseVisitor
return projection;
}
LiteralExpressionSegment column = (LiteralExpressionSegment)
projection;
- ExpressionProjectionSegment result = null == alias ? new
ExpressionProjectionSegment(column.getStartIndex(), column.getStopIndex(),
String.valueOf(column.getLiterals()))
- : new ExpressionProjectionSegment(column.getStartIndex(),
ctx.alias().stop.getStopIndex(), String.valueOf(column.getLiterals()));
+ ExpressionProjectionSegment result = null == alias ? new
ExpressionProjectionSegment(column.getStartIndex(), column.getStopIndex(),
String.valueOf(column.getLiterals()), column)
+ : new ExpressionProjectionSegment(column.getStartIndex(),
ctx.alias().stop.getStopIndex(), String.valueOf(column.getLiterals()), column);
result.setAlias(alias);
return result;
}
diff --git
a/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/dml/item/ExpressionProjectionSegment.java
b/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/dml/item/ExpressionProjectionSegment.java
index ed1dbfe..3d088bb 100644
---
a/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/dml/item/ExpressionProjectionSegment.java
+++
b/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/dml/item/ExpressionProjectionSegment.java
@@ -19,6 +19,7 @@ package
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item;
import lombok.Getter;
import lombok.Setter;
+import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.ExpressionSegment;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.AliasAvailable;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.AliasSegment;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.complex.ComplexExpressionSegment;
@@ -37,6 +38,8 @@ public final class ExpressionProjectionSegment implements
ProjectionSegment, Com
private final int stopIndex;
private final String text;
+
+ private final ExpressionSegment expr;
@Setter
private AliasSegment alias;
@@ -45,6 +48,14 @@ public final class ExpressionProjectionSegment implements
ProjectionSegment, Com
this.startIndex = startIndex;
this.stopIndex = stopIndex;
this.text = SQLUtil.getExpressionWithoutOutsideParentheses(text);
+ this.expr = null;
+ }
+
+ public ExpressionProjectionSegment(final int startIndex, final int
stopIndex, final String text, final ExpressionSegment expr) {
+ this.startIndex = startIndex;
+ this.stopIndex = stopIndex;
+ this.text = SQLUtil.getExpressionWithoutOutsideParentheses(text);
+ this.expr = expr;
}
@Override
diff --git
a/shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/asserts/segment/orderby/OrderByItemAssert.java
b/shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/asserts/segment/orderby/OrderByItemAssert.java
index 51184bc..3c6f9ba 100644
---
a/shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/asserts/segment/orderby/OrderByItemAssert.java
+++
b/shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/asserts/segment/orderby/OrderByItemAssert.java
@@ -79,9 +79,6 @@ public final class OrderByItemAssert {
if (each instanceof ExpressionOrderByItemSegment) {
assertOrderInfo(assertContext, each,
expected.getExpressionItems().get(count), type);
assertExpressionOrderByItem(assertContext,
(ExpressionOrderByItemSegment) each, expected.getExpressionItems().get(count),
type);
- if (null != ((ExpressionOrderByItemSegment) each).getExpr() &&
null != expected.getExpressionItems().get(count).getExpr()) {
- ExpressionAssert.assertExpression(assertContext,
((ExpressionOrderByItemSegment) each).getExpr(),
expected.getExpressionItems().get(count).getExpr());
- }
count++;
}
}
@@ -113,6 +110,9 @@ public final class OrderByItemAssert {
private static void assertExpressionOrderByItem(final SQLCaseAssertContext
assertContext,
final
ExpressionOrderByItemSegment actual, final ExpectedExpressionOrderByItem
expected, final String type) {
assertThat(assertContext.getText(String.format("%s item expression
assertion error: ", type)), actual.getExpression(),
is(expected.getExpression()));
+ if (null != expected.getExpr()) {
+ ExpressionAssert.assertExpression(assertContext, actual.getExpr(),
expected.getExpr());
+ }
SQLSegmentAssert.assertIs(assertContext, actual, expected);
}
}
diff --git
a/shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/asserts/segment/projection/ProjectionAssert.java
b/shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/asserts/segment/projection/ProjectionAssert.java
index 7e0e64f..0bc6dc1 100644
---
a/shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/asserts/segment/projection/ProjectionAssert.java
+++
b/shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/asserts/segment/projection/ProjectionAssert.java
@@ -32,6 +32,7 @@ import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.pagination.ro
import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.pagination.top.TopProjectionSegment;
import
org.apache.shardingsphere.test.sql.parser.parameterized.asserts.SQLCaseAssertContext;
import
org.apache.shardingsphere.test.sql.parser.parameterized.asserts.segment.SQLSegmentAssert;
+import
org.apache.shardingsphere.test.sql.parser.parameterized.asserts.segment.expression.ExpressionAssert;
import
org.apache.shardingsphere.test.sql.parser.parameterized.asserts.segment.owner.OwnerAssert;
import
org.apache.shardingsphere.test.sql.parser.parameterized.asserts.statement.dml.impl.SelectStatementAssert;
import
org.apache.shardingsphere.test.sql.parser.parameterized.asserts.value.IdentifierValueAssert;
@@ -157,6 +158,9 @@ public final class ProjectionAssert {
? expected.getLiteralText() : expected.getText();
assertThat(assertContext.getText("Expression projection text assertion
error: "),
actual.getText(), is(expectedText));
+ if (expected.getExpr() != null) {
+ ExpressionAssert.assertExpression(assertContext, actual.getExpr(),
expected.getExpr());
+ }
}
private static void assertTopProjection(final SQLCaseAssertContext
assertContext, final TopProjectionSegment actual, final ExpectedTopProjection
expected) {
diff --git
a/shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/jaxb/cases/domain/segment/impl/projection/impl/expression/ExpectedExpressionProjection.java
b/shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/jaxb/cases/domain/segment/impl/projection/impl/expression/ExpectedExpressionProjection.java
index 1287aef..5abf8af 100644
---
a/shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/jaxb/cases/domain/segment/impl/projection/impl/expression/ExpectedExpressionProjection.java
+++
b/shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/jaxb/cases/domain/segment/impl/projection/impl/expression/ExpectedExpressionProjection.java
@@ -20,10 +20,12 @@ package
org.apache.shardingsphere.test.sql.parser.parameterized.jaxb.cases.domai
import lombok.Getter;
import lombok.Setter;
import
org.apache.shardingsphere.test.sql.parser.parameterized.jaxb.cases.domain.segment.AbstractExpectedSQLSegment;
+import
org.apache.shardingsphere.test.sql.parser.parameterized.jaxb.cases.domain.segment.impl.expr.ExpectedExpression;
import
org.apache.shardingsphere.test.sql.parser.parameterized.jaxb.cases.domain.segment.impl.expr.complex.ExpectedComplexExpressionSegment;
import
org.apache.shardingsphere.test.sql.parser.parameterized.jaxb.cases.domain.segment.impl.projection.ExpectedProjection;
import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlElement;
@Getter
@Setter
@@ -37,4 +39,7 @@ public final class ExpectedExpressionProjection extends
AbstractExpectedSQLSegme
@XmlAttribute(name = "alias")
private String alias;
+
+ @XmlElement(name = "expr")
+ private ExpectedExpression expr;
}
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 626f2df..e307bfe 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
@@ -1694,4 +1694,35 @@
<column-item name="last_name" start-index="125" stop-index="133" />
</order-by>
</select>
+
+ <select sql-case-id="select_projections_with_expr">
+ <projections start-index="7" stop-index="58">
+ <expression-projection start-index="7" stop-index="11"
text="10+20">
+ <expr>
+ <binary-operation-expression start-index="7"
stop-index="11">
+ <left>
+ <literal-expression value="10" start-index="7"
stop-index="8"/>
+ </left>
+ <right>
+ <literal-expression value="20" start-index="10"
stop-index="11"/>
+ </right>
+ <operator>+</operator>
+ </binary-operation-expression>
+ </expr>
+ </expression-projection>
+ <expression-projection start-index="13" stop-index="56" text="CASE
order_id WHEN 1 THEN '11' ELSE '00' END">
+ <expr>
+ <common-expression literal-text="CASE order_id WHEN 1 THEN
'11' ELSE '00' END" start-index="13" stop-index="56"/>
+ </expr>
+ </expression-projection>
+ <expression-projection start-index="58" stop-index="58" text="1">
+ <expr>
+ <literal-expression value="1" start-index="58"
stop-index="58"/>
+ </expr>
+ </expression-projection>
+ </projections>
+ <from>
+ <simple-table name="t_order" start-index="65" stop-index="71" />
+ </from>
+ </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 9e1bd48..8821b44 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
@@ -78,4 +78,5 @@
<sql-case id="select_where_with_expr_with_not_with_order_by" value="SELECT
last_name, job_id, salary, department_id FROM employees WHERE NOT (job_id =
'PU_CLERK' AND department_id = 30) ORDER BY last_name" db-types="Oracle"/>
<sql-case id="select_where_with_subquery" value="SELECT last_name,
department_id FROM employees WHERE department_id = (SELECT department_id FROM
employees WHERE last_name = 'Lorentz') ORDER BY last_name, department_id"
db-types="Oracle"/>
<sql-case id="select_where_with_expr_with_not_in" value="SELECT * FROM
employees WHERE department_id NOT IN (SELECT department_id FROM departments
WHERE location_id = 1700) ORDER BY last_name" db-types="Oracle"/>
+ <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-cases>