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 7aa90838abc Support dblink skip sql bind (#38296)
7aa90838abc is described below

commit 7aa90838abc4a44868d2c83018994fe051a35bd8
Author: ZhangCheng <[email protected]>
AuthorDate: Mon Mar 2 19:06:57 2026 +0800

    Support dblink skip sql bind (#38296)
---
 .../type/dml/UpdateStatementBaseContext.java          |  2 ++
 .../ddl/column/ColumnDefinitionSegmentBinder.java     |  4 ++--
 .../dml/expression/type/ColumnSegmentBinder.java      |  6 ++++++
 .../context/type/SimpleTableSegmentBinderContext.java |  2 ++
 .../dml/from/type/SimpleTableSegmentBinder.java       | 11 ++++++++---
 .../dml/from/type/SimpleTableSegmentBinderTest.java   | 13 +++++++++++++
 .../statement/core/extractor/ExpressionExtractor.java |  4 ++++
 .../statement/core/extractor/WhereExtractor.java      | 11 +++++++++++
 .../segment/ddl/column/ColumnDefinitionSegment.java   | 19 +++++++++++++++++++
 9 files changed, 67 insertions(+), 5 deletions(-)

diff --git 
a/infra/binder/core/src/main/java/org/apache/shardingsphere/infra/binder/context/statement/type/dml/UpdateStatementBaseContext.java
 
b/infra/binder/core/src/main/java/org/apache/shardingsphere/infra/binder/context/statement/type/dml/UpdateStatementBaseContext.java
index b25e790b653..8da0efa3f41 100644
--- 
a/infra/binder/core/src/main/java/org/apache/shardingsphere/infra/binder/context/statement/type/dml/UpdateStatementBaseContext.java
+++ 
b/infra/binder/core/src/main/java/org/apache/shardingsphere/infra/binder/context/statement/type/dml/UpdateStatementBaseContext.java
@@ -23,6 +23,7 @@ import 
org.apache.shardingsphere.infra.binder.context.statement.SQLStatementCont
 import 
org.apache.shardingsphere.sql.parser.statement.core.extractor.ColumnExtractor;
 import 
org.apache.shardingsphere.sql.parser.statement.core.extractor.ExpressionExtractor;
 import 
org.apache.shardingsphere.sql.parser.statement.core.extractor.TableExtractor;
+import 
org.apache.shardingsphere.sql.parser.statement.core.extractor.WhereExtractor;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.column.ColumnSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.BinaryOperationExpression;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.predicate.WhereSegment;
@@ -59,6 +60,7 @@ public final class UpdateStatementBaseContext implements 
SQLStatementContext {
     private Collection<WhereSegment> createWhereSegments(final UpdateStatement 
updateStatement) {
         Collection<WhereSegment> result = new LinkedList<>();
         updateStatement.getWhere().ifPresent(result::add);
+        
result.addAll(WhereExtractor.extractJoinWhereSegments(updateStatement));
         return result;
     }
     
diff --git 
a/infra/binder/core/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/ddl/column/ColumnDefinitionSegmentBinder.java
 
b/infra/binder/core/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/ddl/column/ColumnDefinitionSegmentBinder.java
index f9e720f7a90..4ebc5f91fbd 100644
--- 
a/infra/binder/core/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/ddl/column/ColumnDefinitionSegmentBinder.java
+++ 
b/infra/binder/core/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/ddl/column/ColumnDefinitionSegmentBinder.java
@@ -57,7 +57,7 @@ public final class ColumnDefinitionSegmentBinder {
     private static void copy(final ColumnDefinitionSegment result, final 
ColumnDefinitionSegment segment) {
         result.setAutoIncrement(segment.isAutoIncrement());
         result.setRef(segment.isRef());
-        result.setCharsetName(segment.getCharsetName());
-        result.setCollateName(segment.getCollateName());
+        segment.getCharsetName().ifPresent(result::setCharsetName);
+        segment.getCollateName().ifPresent(result::setCollateName);
     }
 }
diff --git 
a/infra/binder/core/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/expression/type/ColumnSegmentBinder.java
 
b/infra/binder/core/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/expression/type/ColumnSegmentBinder.java
index 498a06d7cec..eeb3b943d4f 100644
--- 
a/infra/binder/core/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/expression/type/ColumnSegmentBinder.java
+++ 
b/infra/binder/core/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/expression/type/ColumnSegmentBinder.java
@@ -291,11 +291,17 @@ public final class ColumnSegmentBinder {
             if (each instanceof FunctionTableSegmentBinderContext) {
                 return true;
             }
+            if (each instanceof SimpleTableSegmentBinderContext) {
+                return ((SimpleTableSegmentBinderContext) 
each).isContainsDBLink();
+            }
         }
         for (TableSegmentBinderContext each : outerBinderContexts) {
             if (each instanceof FunctionTableSegmentBinderContext) {
                 return true;
             }
+            if (each instanceof SimpleTableSegmentBinderContext) {
+                return ((SimpleTableSegmentBinderContext) 
each).isContainsDBLink();
+            }
         }
         return false;
     }
diff --git 
a/infra/binder/core/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/from/context/type/SimpleTableSegmentBinderContext.java
 
b/infra/binder/core/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/from/context/type/SimpleTableSegmentBinderContext.java
index 5ed3bad76b0..d9aea4f05ca 100644
--- 
a/infra/binder/core/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/from/context/type/SimpleTableSegmentBinderContext.java
+++ 
b/infra/binder/core/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/from/context/type/SimpleTableSegmentBinderContext.java
@@ -46,6 +46,8 @@ public final class SimpleTableSegmentBinderContext implements 
TableSegmentBinder
     
     private boolean fromWithSegment;
     
+    private boolean containsDBLink;
+    
     public SimpleTableSegmentBinderContext(final Collection<ProjectionSegment> 
projectionSegments, final TableSourceType tableSourceType) {
         columnLabelProjectionSegments = new 
CaseInsensitiveMap<>(projectionSegments.size(), 1F);
         projectionSegments.forEach(each -> 
putColumnLabelProjectionSegments(each, columnLabelProjectionSegments));
diff --git 
a/infra/binder/core/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/from/type/SimpleTableSegmentBinder.java
 
b/infra/binder/core/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/from/type/SimpleTableSegmentBinder.java
index ac51ce090d7..bea57cd6afc 100644
--- 
a/infra/binder/core/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/from/type/SimpleTableSegmentBinder.java
+++ 
b/infra/binder/core/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/from/type/SimpleTableSegmentBinder.java
@@ -91,7 +91,7 @@ public final class SimpleTableSegmentBinder {
         Optional<IdentifierValue> schemaName = getSchemaName(segment, 
binderContext, databaseName);
         IdentifierValue tableName = segment.getTableName().getIdentifier();
         Optional<ShardingSphereSchema> schema = schemaName.map(identifierValue 
-> 
binderContext.getMetaData().getDatabase(databaseName.getValue()).getSchema(identifierValue.getValue()));
-        checkTableExists(binderContext, schema.orElse(null), 
tableName.getValue());
+        checkTableExists(binderContext, schema.orElse(null), 
tableName.getValue(), segment);
         checkTableMetadata(binderContext, schema.orElse(null), 
schemaName.map(IdentifierValue::getValue).orElse(null), tableName.getValue());
         
tableBinderContexts.put(CaseInsensitiveString.of(segment.getAliasName().orElseGet(tableName::getValue)),
                 createSimpleTableBinderContext(segment, schema.orElse(null), 
databaseName, schemaName.orElse(null), binderContext));
@@ -133,7 +133,7 @@ public final class SimpleTableSegmentBinder {
         return Optional.of(new 
IdentifierValue(databaseTypeRegistry.getDefaultSchemaName(binderContext.getCurrentDatabaseName())));
     }
     
-    private static void checkTableExists(final SQLStatementBinderContext 
binderContext, final ShardingSphereSchema schema, final String tableName) {
+    private static void checkTableExists(final SQLStatementBinderContext 
binderContext, final ShardingSphereSchema schema, final String tableName, final 
SimpleTableSegment segment) {
         // TODO refactor table exists check with spi @duanzhengqiang
         if (binderContext.getSqlStatement() instanceof CreateTableStatement && 
isCreateTable(((CreateTableStatement) 
binderContext.getSqlStatement()).getTable(), tableName)) {
             
ShardingSpherePreconditions.checkState(binderContext.getHintValueContext().isSkipMetadataValidate()
@@ -178,6 +178,9 @@ public final class SimpleTableSegmentBinder {
         if (null != schema && 
SystemSchemaManager.isSystemTable(schema.getName(), tableName)) {
             return;
         }
+        if (segment.getDbLink().isPresent()) {
+            return;
+        }
         if (null != tableName && 
binderContext.getExternalTableBinderContexts().containsKey(CaseInsensitiveString.of(tableName)))
 {
             return;
         }
@@ -254,7 +257,9 @@ public final class SimpleTableSegmentBinder {
                             TableSourceType.TEMPORARY_TABLE);
             return new SimpleTableSegmentBinderContext(subqueryProjections, 
TableSourceType.TEMPORARY_TABLE);
         }
-        return new SimpleTableSegmentBinderContext(Collections.emptyList(), 
TableSourceType.TEMPORARY_TABLE);
+        SimpleTableSegmentBinderContext result = new 
SimpleTableSegmentBinderContext(Collections.emptyList(), 
TableSourceType.TEMPORARY_TABLE);
+        segment.getDbLink().ifPresent(optional -> 
result.setContainsDBLink(true));
+        return result;
     }
     
     private static Collection<ProjectionSegment> 
createProjectionSegments(final CreateTableStatement sqlStatement, final 
IdentifierValue databaseName,
diff --git 
a/infra/binder/core/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/from/type/SimpleTableSegmentBinderTest.java
 
b/infra/binder/core/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/from/type/SimpleTableSegmentBinderTest.java
index 29678e540e9..7d3b7d50f73 100644
--- 
a/infra/binder/core/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/from/type/SimpleTableSegmentBinderTest.java
+++ 
b/infra/binder/core/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/from/type/SimpleTableSegmentBinderTest.java
@@ -22,6 +22,7 @@ import com.google.common.collect.LinkedHashMultimap;
 import com.google.common.collect.Multimap;
 import org.apache.shardingsphere.database.connector.core.type.DatabaseType;
 import 
org.apache.shardingsphere.infra.binder.engine.segment.dml.from.context.TableSegmentBinderContext;
+import 
org.apache.shardingsphere.infra.binder.engine.segment.dml.from.context.type.SimpleTableSegmentBinderContext;
 import 
org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinderContext;
 import 
org.apache.shardingsphere.infra.exception.kernel.metadata.TableNotFoundException;
 import org.apache.shardingsphere.infra.hint.HintValueContext;
@@ -39,6 +40,7 @@ import java.sql.Types;
 import java.util.Arrays;
 
 import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
@@ -57,6 +59,17 @@ class SimpleTableSegmentBinderTest {
                 simpleTableSegment, new SQLStatementBinderContext(metaData, 
"foo_db", new HintValueContext(), new SelectStatement(databaseType)), 
tableBinderContexts));
     }
     
+    @Test
+    void assertBindWithDBLinkContainsDBLink() {
+        SimpleTableSegment simpleTableSegment = new SimpleTableSegment(new 
TableNameSegment(0, 10, new IdentifierValue("t_not_exists")));
+        simpleTableSegment.setDbLink(new IdentifierValue("foo_db_link"));
+        ShardingSphereMetaData metaData = createMetaData();
+        Multimap<CaseInsensitiveString, TableSegmentBinderContext> 
tableBinderContexts = LinkedHashMultimap.create();
+        SimpleTableSegmentBinder.bind(simpleTableSegment, new 
SQLStatementBinderContext(metaData, "foo_db", new HintValueContext(), new 
SelectStatement(databaseType)), tableBinderContexts);
+        SimpleTableSegmentBinderContext tableSegmentBinderContext = 
(SimpleTableSegmentBinderContext) 
tableBinderContexts.values().iterator().next();
+        assertTrue(tableSegmentBinderContext.isContainsDBLink());
+    }
+    
     private ShardingSphereMetaData createMetaData() {
         ShardingSphereSchema schema = mock(ShardingSphereSchema.class, 
RETURNS_DEEP_STUBS);
         
when(schema.getTable("t_order").getAllColumns()).thenReturn(Arrays.asList(
diff --git 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/extractor/ExpressionExtractor.java
 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/extractor/ExpressionExtractor.java
index 254ed1388fd..7dedd55e92e 100644
--- 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/extractor/ExpressionExtractor.java
+++ 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/extractor/ExpressionExtractor.java
@@ -27,6 +27,7 @@ import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.Betw
 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.CollateExpression;
+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;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.InExpression;
@@ -301,6 +302,9 @@ public final class ExpressionExtractor {
         if (expression instanceof SubqueryExpressionSegment && 
containsSubQuery) {
             ColumnExtractor.extractFromSelectStatement(result, 
((SubqueryExpressionSegment) expression).getSubquery().getSelect(), true);
         }
+        if (expression instanceof ExistsSubqueryExpression && 
containsSubQuery) {
+            ColumnExtractor.extractFromSelectStatement(result, 
((ExistsSubqueryExpression) expression).getSubquery().getSelect(), true);
+        }
         return result;
     }
     
diff --git 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/extractor/WhereExtractor.java
 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/extractor/WhereExtractor.java
index 8fb64228698..88264a110a3 100644
--- 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/extractor/WhereExtractor.java
+++ 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/extractor/WhereExtractor.java
@@ -25,6 +25,7 @@ import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.predicate
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.JoinTableSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.TableSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.type.dml.SelectStatement;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.type.dml.UpdateStatement;
 
 import java.util.Collection;
 import java.util.Collections;
@@ -46,6 +47,16 @@ public final class WhereExtractor {
         return 
selectStatement.getFrom().map(WhereExtractor::extractJoinWhereSegments).orElseGet(Collections::emptyList);
     }
     
+    /**
+     * Extract join where segment from update statement.
+     *
+     * @param updateStatement to be extracted update statement
+     * @return extracted join where segments
+     */
+    public static Collection<WhereSegment> extractJoinWhereSegments(final 
UpdateStatement updateStatement) {
+        return extractJoinWhereSegments(updateStatement.getTable());
+    }
+    
     private static Collection<WhereSegment> extractJoinWhereSegments(final 
TableSegment tableSegment) {
         if (!(tableSegment instanceof JoinTableSegment) || null == 
((JoinTableSegment) tableSegment).getCondition()) {
             return Collections.emptyList();
diff --git 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/segment/ddl/column/ColumnDefinitionSegment.java
 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/segment/ddl/column/ColumnDefinitionSegment.java
index 1895e2cc79c..9a36c19bba2 100644
--- 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/segment/ddl/column/ColumnDefinitionSegment.java
+++ 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/segment/ddl/column/ColumnDefinitionSegment.java
@@ -27,6 +27,7 @@ import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table
 
 import java.util.Collection;
 import java.util.LinkedList;
+import java.util.Optional;
 
 /**
  * Column definition segment.
@@ -65,4 +66,22 @@ public final class ColumnDefinitionSegment implements 
CreateDefinitionSegment {
     
     @Setter
     private String comment;
+    
+    /**
+     * Get charset name.
+     *
+     * @return charset name
+     */
+    public Optional<String> getCharsetName() {
+        return Optional.ofNullable(charsetName);
+    }
+    
+    /**
+     * Get collate name.
+     *
+     * @return collate name
+     */
+    public Optional<String> getCollateName() {
+        return Optional.ofNullable(collateName);
+    }
 }

Reply via email to