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);
+    }
+}

Reply via email to