This is an automated email from the ASF dual-hosted git repository. chengzhang 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 17e9bf411aa Support case when then else segment bind (#34600) 17e9bf411aa is described below commit 17e9bf411aa5b8715401c76546c6d8536ab5c69a Author: Zhengqiang Duan <duanzhengqi...@apache.org> AuthorDate: Sat Feb 8 10:38:43 2025 +0800 Support case when then else segment bind (#34600) --- RELEASE-NOTES.md | 1 + .../dml/expression/ExpressionSegmentBinder.java | 5 ++ .../expression/type/CaseWhenExpressionBinder.java | 61 ++++++++++++++++++++++ 3 files changed, 67 insertions(+) diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md index 97d77dfd8dd..e3d3670346e 100644 --- a/RELEASE-NOTES.md +++ b/RELEASE-NOTES.md @@ -9,6 +9,7 @@ 1. Infra: Support for connecting to Presto's Memory Connector in ShardingSphere config - [#34432](https://github.com/apache/shardingsphere/pull/34432) 1. Metadata: Add support for partition tables in PostgreSQL [#34346](https://github.com/apache/shardingsphere/pull/34346) 1. SQL Binder: Support select aggregation function sql bind in projection and having - [#34379](https://github.com/apache/shardingsphere/pull/34379) +1. SQL Binder: Support case when then else segment bind - [#34600](https://github.com/apache/shardingsphere/pull/34600) ### Bug Fixes diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/expression/ExpressionSegmentBinder.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/expression/ExpressionSegmentBinder.java index d99ecd05166..f19b438d092 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/expression/ExpressionSegmentBinder.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/expression/ExpressionSegmentBinder.java @@ -27,6 +27,7 @@ import org.apache.shardingsphere.infra.binder.engine.segment.dml.expression.type import org.apache.shardingsphere.infra.binder.engine.segment.dml.expression.type.AggregationProjectionSegmentBinder; import org.apache.shardingsphere.infra.binder.engine.segment.dml.expression.type.BetweenExpressionSegmentBinder; import org.apache.shardingsphere.infra.binder.engine.segment.dml.expression.type.BinaryOperationExpressionBinder; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.expression.type.CaseWhenExpressionBinder; import org.apache.shardingsphere.infra.binder.engine.segment.dml.expression.type.ColumnSegmentBinder; import org.apache.shardingsphere.infra.binder.engine.segment.dml.expression.type.ExistsSubqueryExpressionBinder; import org.apache.shardingsphere.infra.binder.engine.segment.dml.expression.type.FunctionExpressionSegmentBinder; @@ -38,6 +39,7 @@ import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinde import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.column.ColumnSegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.BetweenExpression; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.BinaryOperationExpression; +import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.CaseWhenExpression; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.ExistsSubqueryExpression; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.ExpressionSegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.FunctionSegment; @@ -99,6 +101,9 @@ public final class ExpressionSegmentBinder { if (segment instanceof AggregationProjectionSegment) { return AggregationProjectionSegmentBinder.bind((AggregationProjectionSegment) segment, parentSegmentType, binderContext, tableBinderContexts, outerTableBinderContexts); } + if (segment instanceof CaseWhenExpression) { + return CaseWhenExpressionBinder.bind((CaseWhenExpression) segment, parentSegmentType, binderContext, tableBinderContexts, outerTableBinderContexts); + } // TODO support more ExpressionSegment bound return segment; } diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/expression/type/CaseWhenExpressionBinder.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/expression/type/CaseWhenExpressionBinder.java new file mode 100644 index 00000000000..4eb5ad5d8f9 --- /dev/null +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/expression/type/CaseWhenExpressionBinder.java @@ -0,0 +1,61 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.shardingsphere.infra.binder.engine.segment.dml.expression.type; + +import com.cedarsoftware.util.CaseInsensitiveMap.CaseInsensitiveString; +import com.google.common.collect.Multimap; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; +import org.apache.shardingsphere.infra.binder.engine.segment.SegmentType; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.expression.ExpressionSegmentBinder; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.from.context.TableSegmentBinderContext; +import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinderContext; +import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.CaseWhenExpression; +import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.ExpressionSegment; + +import java.util.Collection; +import java.util.LinkedList; + +/** + * Case when expression binder. + */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public final class CaseWhenExpressionBinder { + + /** + * Bind case when expression. + * + * @param segment case when expression + * @param parentSegmentType parent segment type + * @param binderContext SQL statement binder context + * @param tableBinderContexts table binder contexts + * @param outerTableBinderContexts outer table binder contexts + * @return bound case when expression + */ + public static CaseWhenExpression bind(final CaseWhenExpression segment, final SegmentType parentSegmentType, + final SQLStatementBinderContext binderContext, final Multimap<CaseInsensitiveString, TableSegmentBinderContext> tableBinderContexts, + final Multimap<CaseInsensitiveString, TableSegmentBinderContext> outerTableBinderContexts) { + ExpressionSegment boundCaseExpr = ExpressionSegmentBinder.bind(segment.getCaseExpr(), parentSegmentType, binderContext, tableBinderContexts, outerTableBinderContexts); + Collection<ExpressionSegment> boundWhenExprs = new LinkedList<>(); + Collection<ExpressionSegment> boundThenExprs = new LinkedList<>(); + segment.getWhenExprs().forEach(each -> boundWhenExprs.add(ExpressionSegmentBinder.bind(each, parentSegmentType, binderContext, tableBinderContexts, outerTableBinderContexts))); + segment.getThenExprs().forEach(each -> boundThenExprs.add(ExpressionSegmentBinder.bind(each, parentSegmentType, binderContext, tableBinderContexts, outerTableBinderContexts))); + ExpressionSegment boundElseExpr = ExpressionSegmentBinder.bind(segment.getElseExpr(), parentSegmentType, binderContext, tableBinderContexts, outerTableBinderContexts); + return new CaseWhenExpression(segment.getStartIndex(), segment.getStopIndex(), boundCaseExpr, boundWhenExprs, boundThenExprs, boundElseExpr); + } +}