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 92bc780afbe Add binding to owner table (#33533)
92bc780afbe is described below

commit 92bc780afbe47ea305773911e8df205e145b54ce
Author: ZhangCheng <[email protected]>
AuthorDate: Mon Nov 4 16:41:13 2024 +0800

    Add binding to owner table (#33533)
    
    * Add binding to owner table
    
    * Add binding to owner table
---
 RELEASE-NOTES.md                                   |  1 +
 .../expression/type/ColumnSegmentBinder.java       | 13 ++++++++-
 .../expression/type/ColumnSegmentBinderTest.java   | 31 ++++++++++++++++++++++
 .../core/segment/generic/OwnerSegment.java         | 12 +++++++++
 .../TableSegmentBoundInfo.java}                    | 15 ++++-------
 .../segment/generic/table/TableNameSegment.java    |  3 +++
 .../parser/statement/core/util/TableExtractor.java |  4 ++-
 7 files changed, 67 insertions(+), 12 deletions(-)

diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md
index 5f4326bfb74..dd8d0772ef4 100644
--- a/RELEASE-NOTES.md
+++ b/RELEASE-NOTES.md
@@ -16,6 +16,7 @@
 1. Kernel: Add index columns not empty judgement for IndexColumnTokenGenerator 
- [#33384](https://github.com/apache/shardingsphere/pull/33384)
 1. SQL Parser: Support parsing Doris STRRIGHT - 
[#33393](https://github.com/apache/shardingsphere/pull/33393)
 1. JDBC: Add show database name for JDBC when execute SHOW COMPUTE NODES - 
[#33437](https://github.com/apache/shardingsphere/pull/33437)
+1. Kernel: Add binding to owner table - 
[#33533](https://github.com/apache/shardingsphere/pull/33533)
 
 ### Bug Fixes
 
diff --git 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/ColumnSegmentBinder.java
 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/ColumnSegmentBinder.java
index b7c563bf8c0..e1d828befe8 100644
--- 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/ColumnSegmentBinder.java
+++ 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/ColumnSegmentBinder.java
@@ -34,7 +34,9 @@ import 
org.apache.shardingsphere.infra.exception.kernel.syntax.AmbiguousColumnEx
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.column.ColumnSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.ColumnProjectionSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.ProjectionSegment;
+import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.OwnerSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.bound.ColumnSegmentBoundInfo;
+import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.bound.TableSegmentBoundInfo;
 import 
org.apache.shardingsphere.sql.parser.statement.core.value.identifier.IdentifierValue;
 
 import java.util.ArrayList;
@@ -82,18 +84,27 @@ public final class ColumnSegmentBinder {
         Collection<TableSegmentBinderContext> tableSegmentBinderContexts = 
getTableSegmentBinderContexts(segment, parentSegmentType, binderContext, 
tableBinderContexts, outerTableBinderContexts);
         Optional<ColumnSegment> inputColumnSegment = 
findInputColumnSegment(segment, parentSegmentType, tableSegmentBinderContexts, 
outerTableBinderContexts, binderContext);
         inputColumnSegment.ifPresent(optional -> 
result.setVariable(optional.isVariable()));
+        segment.getOwner().ifPresent(optional -> 
result.setOwner(bindOwnerTableContext(optional, 
inputColumnSegment.orElse(null))));
         result.setColumnBoundInfo(createColumnSegmentBoundInfo(segment, 
inputColumnSegment.orElse(null)));
         return result;
     }
     
     private static ColumnSegment copy(final ColumnSegment segment) {
         ColumnSegment result = new ColumnSegment(segment.getStartIndex(), 
segment.getStopIndex(), segment.getIdentifier());
-        segment.getOwner().ifPresent(result::setOwner);
         segment.getLeftParentheses().ifPresent(result::setLeftParentheses);
         segment.getRightParentheses().ifPresent(result::setRightParentheses);
         return result;
     }
     
+    private static OwnerSegment bindOwnerTableContext(final OwnerSegment 
owner, final ColumnSegment inputColumnSegment) {
+        IdentifierValue originalDatabase = null == inputColumnSegment ? null : 
inputColumnSegment.getColumnBoundInfo().getOriginalDatabase();
+        IdentifierValue originalSchema = null == inputColumnSegment ? null : 
inputColumnSegment.getColumnBoundInfo().getOriginalSchema();
+        if (originalDatabase != null && originalSchema != null) {
+            owner.setTableBoundInfo(new 
TableSegmentBoundInfo(originalDatabase, originalSchema));
+        }
+        return owner;
+    }
+    
     private static Collection<TableSegmentBinderContext> 
getTableSegmentBinderContexts(final ColumnSegment segment, final SegmentType 
parentSegmentType,
                                                                                
        final SQLStatementBinderContext binderContext,
                                                                                
        final Multimap<CaseInsensitiveString, TableSegmentBinderContext> 
tableBinderContexts,
diff --git 
a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/ColumnSegmentBinderTest.java
 
b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/ColumnSegmentBinderTest.java
index 753dd0b6559..63313065eba 100644
--- 
a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/ColumnSegmentBinderTest.java
+++ 
b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/ColumnSegmentBinderTest.java
@@ -33,6 +33,7 @@ import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.column.Co
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.ColumnProjectionSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.OwnerSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.bound.ColumnSegmentBoundInfo;
+import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.bound.TableSegmentBoundInfo;
 import 
org.apache.shardingsphere.sql.parser.statement.core.value.identifier.IdentifierValue;
 import org.junit.jupiter.api.Test;
 
@@ -43,6 +44,7 @@ import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertNull;
 import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.mockito.Mockito.mock;
 
 class ColumnSegmentBinderTest {
@@ -134,4 +136,33 @@ class ColumnSegmentBinderTest {
         assertThat(actual.getColumnBoundInfo().getOriginalTable().getValue(), 
is("t_order_item"));
         assertThat(actual.getColumnBoundInfo().getOriginalColumn().getValue(), 
is("status"));
     }
+    
+    @Test
+    void assertBindOwner() {
+        Multimap<CaseInsensitiveString, TableSegmentBinderContext> 
tableBinderContexts = LinkedHashMultimap.create();
+        ColumnSegment boundOrderIdColumn = new ColumnSegment(0, 0, new 
IdentifierValue("order_id"));
+        boundOrderIdColumn.setColumnBoundInfo(new ColumnSegmentBoundInfo(new 
IdentifierValue(DefaultDatabase.LOGIC_NAME), new 
IdentifierValue(DefaultDatabase.LOGIC_NAME),
+                new IdentifierValue("t_order"), new 
IdentifierValue("order_id")));
+        tableBinderContexts.put(new CaseInsensitiveString("t_order"), new 
SimpleTableSegmentBinderContext(Collections.singleton(new 
ColumnProjectionSegment(boundOrderIdColumn))));
+        ColumnSegment boundItemIdColumn = new ColumnSegment(0, 0, new 
IdentifierValue("item_id"));
+        boundItemIdColumn.setColumnBoundInfo(new ColumnSegmentBoundInfo(new 
IdentifierValue(DefaultDatabase.LOGIC_NAME), new 
IdentifierValue(DefaultDatabase.LOGIC_NAME),
+                new IdentifierValue("t_order_item"), new 
IdentifierValue("item_id")));
+        tableBinderContexts.put(new CaseInsensitiveString("t_order_item"), new 
SimpleTableSegmentBinderContext(Collections.singleton(new 
ColumnProjectionSegment(boundItemIdColumn))));
+        ColumnSegment columnSegment = new ColumnSegment(0, 0, new 
IdentifierValue("order_id"));
+        columnSegment.setOwner(new OwnerSegment(0, 0, new 
IdentifierValue("t_order")));
+        SQLStatementBinderContext binderContext =
+                new 
SQLStatementBinderContext(mock(ShardingSphereMetaData.class), 
DefaultDatabase.LOGIC_NAME, TypedSPILoader.getService(DatabaseType.class, 
"FIXTURE"), Collections.emptySet());
+        ColumnSegment actual = ColumnSegmentBinder.bind(columnSegment, 
SegmentType.JOIN_ON, binderContext, tableBinderContexts, 
LinkedHashMultimap.create());
+        assertTrue(actual.getOwner().isPresent());
+        assertTrue(actual.getOwner().get().getTableBoundInfo().isPresent());
+        TableSegmentBoundInfo actualTableBoundInfo = 
actual.getOwner().get().getTableBoundInfo().get();
+        assertThat(actualTableBoundInfo.getOriginalDatabase().getValue(), 
is(DefaultDatabase.LOGIC_NAME));
+        assertThat(actualTableBoundInfo.getOriginalSchema().getValue(), 
is(DefaultDatabase.LOGIC_NAME));
+        assertNotNull(actual.getColumnBoundInfo());
+        assertNull(actual.getOtherUsingColumnBoundInfo());
+        
assertThat(actual.getColumnBoundInfo().getOriginalDatabase().getValue(), 
is(DefaultDatabase.LOGIC_NAME));
+        assertThat(actual.getColumnBoundInfo().getOriginalSchema().getValue(), 
is(DefaultDatabase.LOGIC_NAME));
+        assertThat(actual.getColumnBoundInfo().getOriginalTable().getValue(), 
is("t_order"));
+        assertThat(actual.getColumnBoundInfo().getOriginalColumn().getValue(), 
is("order_id"));
+    }
 }
diff --git 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/segment/generic/OwnerSegment.java
 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/segment/generic/OwnerSegment.java
index 9dcc0d89efc..486514a7348 100644
--- 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/segment/generic/OwnerSegment.java
+++ 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/segment/generic/OwnerSegment.java
@@ -21,6 +21,7 @@ import lombok.Getter;
 import lombok.RequiredArgsConstructor;
 import lombok.Setter;
 import org.apache.shardingsphere.sql.parser.statement.core.segment.SQLSegment;
+import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.bound.TableSegmentBoundInfo;
 import 
org.apache.shardingsphere.sql.parser.statement.core.value.identifier.IdentifierValue;
 
 import java.util.Optional;
@@ -41,6 +42,8 @@ public final class OwnerSegment implements SQLSegment {
     
     private OwnerSegment owner;
     
+    private TableSegmentBoundInfo tableBoundInfo;
+    
     /**
      * Get owner.
      *
@@ -49,4 +52,13 @@ public final class OwnerSegment implements SQLSegment {
     public Optional<OwnerSegment> getOwner() {
         return Optional.ofNullable(owner);
     }
+    
+    /**
+     * Get table bound info.
+     *
+     * @return table bound info
+     */
+    public Optional<TableSegmentBoundInfo> getTableBoundInfo() {
+        return Optional.ofNullable(tableBoundInfo);
+    }
 }
diff --git 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/segment/generic/table/TableNameSegment.java
 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/segment/generic/bound/TableSegmentBoundInfo.java
similarity index 76%
copy from 
parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/segment/generic/table/TableNameSegment.java
copy to 
parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/segment/generic/bound/TableSegmentBoundInfo.java
index c5b1140b75a..97ec0c7f8aa 100644
--- 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/segment/generic/table/TableNameSegment.java
+++ 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/segment/generic/bound/TableSegmentBoundInfo.java
@@ -15,25 +15,20 @@
  * limitations under the License.
  */
 
-package 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table;
+package 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.bound;
 
 import lombok.Getter;
 import lombok.RequiredArgsConstructor;
-import lombok.Setter;
-import org.apache.shardingsphere.sql.parser.statement.core.segment.SQLSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.value.identifier.IdentifierValue;
 
 /**
- * Table name segment.
+ * Table name bound info.
  */
 @RequiredArgsConstructor
 @Getter
-@Setter
-public final class TableNameSegment implements SQLSegment {
+public final class TableSegmentBoundInfo {
     
-    private final int startIndex;
+    private final IdentifierValue originalDatabase;
     
-    private final int stopIndex;
-    
-    private final IdentifierValue identifier;
+    private final IdentifierValue originalSchema;
 }
diff --git 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/segment/generic/table/TableNameSegment.java
 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/segment/generic/table/TableNameSegment.java
index c5b1140b75a..d12bf30caad 100644
--- 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/segment/generic/table/TableNameSegment.java
+++ 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/segment/generic/table/TableNameSegment.java
@@ -21,6 +21,7 @@ import lombok.Getter;
 import lombok.RequiredArgsConstructor;
 import lombok.Setter;
 import org.apache.shardingsphere.sql.parser.statement.core.segment.SQLSegment;
+import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.bound.TableSegmentBoundInfo;
 import 
org.apache.shardingsphere.sql.parser.statement.core.value.identifier.IdentifierValue;
 
 /**
@@ -36,4 +37,6 @@ public final class TableNameSegment implements SQLSegment {
     private final int stopIndex;
     
     private final IdentifierValue identifier;
+    
+    private TableSegmentBoundInfo tableBoundInfo;
 }
diff --git 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/util/TableExtractor.java
 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/util/TableExtractor.java
index 7cc6bfe08c2..ecbeb7bd696 100644
--- 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/util/TableExtractor.java
+++ 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/util/TableExtractor.java
@@ -283,7 +283,9 @@ public final class TableExtractor {
         for (ColumnSegment each : columnSegments) {
             if (each.getOwner().isPresent() && 
needRewrite(each.getOwner().get())) {
                 OwnerSegment ownerSegment = each.getOwner().get();
-                rewriteTables.add(new SimpleTableSegment(new 
TableNameSegment(ownerSegment.getStartIndex(), ownerSegment.getStopIndex(), 
ownerSegment.getIdentifier())));
+                TableNameSegment tableSegment = new 
TableNameSegment(ownerSegment.getStartIndex(), ownerSegment.getStopIndex(), 
ownerSegment.getIdentifier());
+                
ownerSegment.getTableBoundInfo().ifPresent(tableSegment::setTableBoundInfo);
+                rewriteTables.add(new SimpleTableSegment(tableSegment));
             }
         }
     }

Reply via email to