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