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 7f3c113247c Support bind delete and update (#28228)
7f3c113247c is described below

commit 7f3c113247c252f06e7affc6bdf368368256e23d
Author: Chuxin Chen <[email protected]>
AuthorDate: Wed Aug 23 16:44:19 2023 +0800

    Support bind delete and update (#28228)
    
    * Support bind functionSegment
    
    * Support bind delete and update
    
    * Support bind delete and update
---
 .../infra/binder/engine/SQLBindEngine.java         | 10 +++
 .../binder/segment/from/TableSegmentBinder.java    |  5 ++
 .../from/impl/DeleteMultiTableSegmentBinder.java   | 52 ++++++++++++++
 .../statement/dml/DeleteStatementBinder.java       | 57 +++++++++++++++
 .../statement/dml/UpdateStatementBinder.java       | 57 +++++++++++++++
 .../statement/DeleteStatementBinderTest.java       | 81 ++++++++++++++++++++++
 .../statement/UpdateStatementBinderTest.java       | 81 ++++++++++++++++++++++
 .../handler/dml/DeleteStatementHandler.java        | 48 +++++++++++++
 .../handler/dml/UpdateStatementHandler.java        | 52 ++++++++++++++
 .../hbase/handler/HBaseBackendUpdateHandler.java   |  4 +-
 .../type/HBaseDeleteOperationConverterTest.java    | 29 +++++++-
 .../type/HBaseUpdateOperationConverterTest.java    | 30 +++++++-
 .../query/MySQLComQueryPacketExecutorTest.java     | 13 +++-
 .../query/MySQLMultiStatementsHandlerTest.java     |  6 ++
 .../parse/PostgreSQLComParseExecutorTest.java      | 18 +++++
 .../scenario/sharding/case/dml/delete.xml          |  4 +-
 16 files changed, 535 insertions(+), 12 deletions(-)

diff --git 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/SQLBindEngine.java
 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/SQLBindEngine.java
index 5847c5800ba..aefef195a8c 100644
--- 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/SQLBindEngine.java
+++ 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/SQLBindEngine.java
@@ -20,8 +20,10 @@ package org.apache.shardingsphere.infra.binder.engine;
 import 
org.apache.shardingsphere.infra.binder.context.statement.SQLStatementContext;
 import 
org.apache.shardingsphere.infra.binder.context.statement.SQLStatementContextFactory;
 import 
org.apache.shardingsphere.infra.binder.statement.ddl.CursorStatementBinder;
+import 
org.apache.shardingsphere.infra.binder.statement.dml.DeleteStatementBinder;
 import 
org.apache.shardingsphere.infra.binder.statement.dml.InsertStatementBinder;
 import 
org.apache.shardingsphere.infra.binder.statement.dml.SelectStatementBinder;
+import 
org.apache.shardingsphere.infra.binder.statement.dml.UpdateStatementBinder;
 import org.apache.shardingsphere.infra.hint.HintValueContext;
 import org.apache.shardingsphere.infra.hint.SQLHintUtils;
 import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
@@ -29,8 +31,10 @@ import 
org.apache.shardingsphere.sql.parser.sql.common.statement.AbstractSQLStat
 import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.common.statement.ddl.DDLStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.common.statement.dml.DMLStatement;
+import 
org.apache.shardingsphere.sql.parser.sql.common.statement.dml.DeleteStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.common.statement.dml.InsertStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.common.statement.dml.SelectStatement;
+import 
org.apache.shardingsphere.sql.parser.sql.common.statement.dml.UpdateStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.opengauss.ddl.OpenGaussCursorStatement;
 
 import java.util.List;
@@ -88,6 +92,12 @@ public final class SQLBindEngine {
         if (statement instanceof InsertStatement) {
             return new InsertStatementBinder().bind((InsertStatement) 
statement, metaData, defaultDatabaseName);
         }
+        if (statement instanceof UpdateStatement) {
+            return new UpdateStatementBinder().bind((UpdateStatement) 
statement, metaData, defaultDatabaseName);
+        }
+        if (statement instanceof DeleteStatement) {
+            return new DeleteStatementBinder().bind((DeleteStatement) 
statement, metaData, defaultDatabaseName);
+        }
         return statement;
     }
     
diff --git 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/from/TableSegmentBinder.java
 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/from/TableSegmentBinder.java
index c9bbae11196..0304a433b94 100644
--- 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/from/TableSegmentBinder.java
+++ 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/from/TableSegmentBinder.java
@@ -19,10 +19,12 @@ package org.apache.shardingsphere.infra.binder.segment.from;
 
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
+import 
org.apache.shardingsphere.infra.binder.segment.from.impl.DeleteMultiTableSegmentBinder;
 import 
org.apache.shardingsphere.infra.binder.segment.from.impl.JoinTableSegmentBinder;
 import 
org.apache.shardingsphere.infra.binder.segment.from.impl.SimpleTableSegmentBinder;
 import 
org.apache.shardingsphere.infra.binder.segment.from.impl.SubqueryTableSegmentBinder;
 import 
org.apache.shardingsphere.infra.binder.statement.SQLStatementBinderContext;
+import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.DeleteMultiTableSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.JoinTableSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.SimpleTableSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.SubqueryTableSegment;
@@ -54,6 +56,9 @@ public final class TableSegmentBinder {
         if (segment instanceof SubqueryTableSegment) {
             return SubqueryTableSegmentBinder.bind((SubqueryTableSegment) 
segment, statementBinderContext, tableBinderContexts);
         }
+        if (segment instanceof DeleteMultiTableSegment) {
+            return 
DeleteMultiTableSegmentBinder.bind((DeleteMultiTableSegment) segment, 
statementBinderContext, tableBinderContexts);
+        }
         return segment;
     }
 }
diff --git 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/from/impl/DeleteMultiTableSegmentBinder.java
 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/from/impl/DeleteMultiTableSegmentBinder.java
new file mode 100644
index 00000000000..6a471778003
--- /dev/null
+++ 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/from/impl/DeleteMultiTableSegmentBinder.java
@@ -0,0 +1,52 @@
+/*
+ * 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.segment.from.impl;
+
+import lombok.AccessLevel;
+import lombok.NoArgsConstructor;
+import org.apache.shardingsphere.infra.binder.segment.from.TableSegmentBinder;
+import 
org.apache.shardingsphere.infra.binder.segment.from.TableSegmentBinderContext;
+import 
org.apache.shardingsphere.infra.binder.statement.SQLStatementBinderContext;
+import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.DeleteMultiTableSegment;
+
+import java.util.Map;
+
+/**
+ * Delete multi table segment binder.
+ */
+@NoArgsConstructor(access = AccessLevel.PRIVATE)
+public final class DeleteMultiTableSegmentBinder {
+    
+    /**
+     * Bind delete multi table segment with metadata.
+     *
+     * @param segment delete multi table segment
+     * @param statementBinderContext statement binder context
+     * @param tableBinderContexts table binder contexts
+     * @return bounded join table segment
+     */
+    public static DeleteMultiTableSegment bind(final DeleteMultiTableSegment 
segment, final SQLStatementBinderContext statementBinderContext,
+                                               final Map<String, 
TableSegmentBinderContext> tableBinderContexts) {
+        DeleteMultiTableSegment result = new DeleteMultiTableSegment();
+        result.setStartIndex(segment.getStartIndex());
+        result.setStopIndex(segment.getStopIndex());
+        result.getActualDeleteTables().addAll(segment.getActualDeleteTables());
+        
result.setRelationTable(TableSegmentBinder.bind(segment.getRelationTable(), 
statementBinderContext, tableBinderContexts));
+        return result;
+    }
+}
diff --git 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/statement/dml/DeleteStatementBinder.java
 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/statement/dml/DeleteStatementBinder.java
new file mode 100644
index 00000000000..53664c6d6c1
--- /dev/null
+++ 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/statement/dml/DeleteStatementBinder.java
@@ -0,0 +1,57 @@
+/*
+ * 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.statement.dml;
+
+import lombok.SneakyThrows;
+import org.apache.commons.collections4.map.CaseInsensitiveMap;
+import org.apache.shardingsphere.infra.binder.segment.from.TableSegmentBinder;
+import 
org.apache.shardingsphere.infra.binder.segment.from.TableSegmentBinderContext;
+import org.apache.shardingsphere.infra.binder.segment.where.WhereSegmentBinder;
+import org.apache.shardingsphere.infra.binder.statement.SQLStatementBinder;
+import 
org.apache.shardingsphere.infra.binder.statement.SQLStatementBinderContext;
+import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
+import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.TableSegment;
+import 
org.apache.shardingsphere.sql.parser.sql.common.statement.dml.DeleteStatement;
+import 
org.apache.shardingsphere.sql.parser.sql.dialect.handler.dml.DeleteStatementHandler;
+
+import java.util.Collections;
+import java.util.Map;
+
+/**
+ * Update statement binder.
+ */
+public final class DeleteStatementBinder implements 
SQLStatementBinder<DeleteStatement> {
+    
+    @SneakyThrows
+    @Override
+    public DeleteStatement bind(final DeleteStatement sqlStatement, final 
ShardingSphereMetaData metaData, final String defaultDatabaseName) {
+        DeleteStatement result = 
sqlStatement.getClass().getDeclaredConstructor().newInstance();
+        Map<String, TableSegmentBinderContext> tableBinderContexts = new 
CaseInsensitiveMap<>();
+        SQLStatementBinderContext statementBinderContext = new 
SQLStatementBinderContext(metaData, defaultDatabaseName, 
sqlStatement.getDatabaseType());
+        TableSegment boundedTableSegment = 
TableSegmentBinder.bind(sqlStatement.getTable(), statementBinderContext, 
tableBinderContexts);
+        result.setTable(boundedTableSegment);
+        sqlStatement.getWhere().ifPresent(optional -> 
result.setWhere(WhereSegmentBinder.bind(optional, statementBinderContext, 
tableBinderContexts, Collections.emptyMap())));
+        
DeleteStatementHandler.getOrderBySegment(sqlStatement).ifPresent(optional -> 
DeleteStatementHandler.setOrderBySegment(result, optional));
+        
DeleteStatementHandler.getLimitSegment(sqlStatement).ifPresent(optional -> 
DeleteStatementHandler.setLimitSegment(result, optional));
+        DeleteStatementHandler.getWithSegment(sqlStatement).ifPresent(optional 
-> DeleteStatementHandler.setWithSegment(result, optional));
+        
DeleteStatementHandler.getOutputSegment(sqlStatement).ifPresent(optional -> 
DeleteStatementHandler.setOutputSegment(result, optional));
+        
result.addParameterMarkerSegments(sqlStatement.getParameterMarkerSegments());
+        result.getCommentSegments().addAll(sqlStatement.getCommentSegments());
+        return result;
+    }
+}
diff --git 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/statement/dml/UpdateStatementBinder.java
 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/statement/dml/UpdateStatementBinder.java
new file mode 100644
index 00000000000..62f51217018
--- /dev/null
+++ 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/statement/dml/UpdateStatementBinder.java
@@ -0,0 +1,57 @@
+/*
+ * 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.statement.dml;
+
+import lombok.SneakyThrows;
+import org.apache.commons.collections4.map.CaseInsensitiveMap;
+import org.apache.shardingsphere.infra.binder.segment.from.TableSegmentBinder;
+import 
org.apache.shardingsphere.infra.binder.segment.from.TableSegmentBinderContext;
+import org.apache.shardingsphere.infra.binder.segment.where.WhereSegmentBinder;
+import org.apache.shardingsphere.infra.binder.statement.SQLStatementBinder;
+import 
org.apache.shardingsphere.infra.binder.statement.SQLStatementBinderContext;
+import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
+import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.TableSegment;
+import 
org.apache.shardingsphere.sql.parser.sql.common.statement.dml.UpdateStatement;
+import 
org.apache.shardingsphere.sql.parser.sql.dialect.handler.dml.UpdateStatementHandler;
+
+import java.util.Collections;
+import java.util.Map;
+
+/**
+ * Update statement binder.
+ */
+public final class UpdateStatementBinder implements 
SQLStatementBinder<UpdateStatement> {
+    
+    @SneakyThrows
+    @Override
+    public UpdateStatement bind(final UpdateStatement sqlStatement, final 
ShardingSphereMetaData metaData, final String defaultDatabaseName) {
+        UpdateStatement result = 
sqlStatement.getClass().getDeclaredConstructor().newInstance();
+        Map<String, TableSegmentBinderContext> tableBinderContexts = new 
CaseInsensitiveMap<>();
+        SQLStatementBinderContext statementBinderContext = new 
SQLStatementBinderContext(metaData, defaultDatabaseName, 
sqlStatement.getDatabaseType());
+        TableSegment boundedTableSegment = 
TableSegmentBinder.bind(sqlStatement.getTable(), statementBinderContext, 
tableBinderContexts);
+        result.setTable(boundedTableSegment);
+        result.setSetAssignment(sqlStatement.getSetAssignment());
+        sqlStatement.getWhere().ifPresent(optional -> 
result.setWhere(WhereSegmentBinder.bind(optional, statementBinderContext, 
tableBinderContexts, Collections.emptyMap())));
+        
UpdateStatementHandler.getOrderBySegment(sqlStatement).ifPresent(optional -> 
UpdateStatementHandler.setOrderBySegment(result, optional));
+        
UpdateStatementHandler.getLimitSegment(sqlStatement).ifPresent(optional -> 
UpdateStatementHandler.setLimitSegment(result, optional));
+        UpdateStatementHandler.getWithSegment(sqlStatement).ifPresent(optional 
-> UpdateStatementHandler.setWithSegment(result, optional));
+        
result.addParameterMarkerSegments(sqlStatement.getParameterMarkerSegments());
+        result.getCommentSegments().addAll(sqlStatement.getCommentSegments());
+        return result;
+    }
+}
diff --git 
a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/statement/DeleteStatementBinderTest.java
 
b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/statement/DeleteStatementBinderTest.java
new file mode 100644
index 00000000000..97e93fe3aa6
--- /dev/null
+++ 
b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/statement/DeleteStatementBinderTest.java
@@ -0,0 +1,81 @@
+/*
+ * 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.statement;
+
+import 
org.apache.shardingsphere.infra.binder.statement.dml.DeleteStatementBinder;
+import org.apache.shardingsphere.infra.database.core.DefaultDatabase;
+import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
+import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereColumn;
+import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema;
+import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.column.ColumnSegment;
+import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.BinaryOperationExpression;
+import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.simple.LiteralExpressionSegment;
+import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.predicate.WhereSegment;
+import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.SimpleTableSegment;
+import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.TableNameSegment;
+import 
org.apache.shardingsphere.sql.parser.sql.common.statement.dml.DeleteStatement;
+import 
org.apache.shardingsphere.sql.parser.sql.common.value.identifier.IdentifierValue;
+import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.dml.MySQLDeleteStatement;
+import org.junit.jupiter.api.Test;
+
+import java.sql.Types;
+import java.util.Arrays;
+
+import static org.hamcrest.CoreMatchers.instanceOf;
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.not;
+import static org.hamcrest.MatcherAssert.assertThat;
+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;
+
+class DeleteStatementBinderTest {
+    
+    @Test
+    void assertBind() {
+        DeleteStatement deleteStatement = new MySQLDeleteStatement();
+        SimpleTableSegment simpleTableSegment = new SimpleTableSegment(new 
TableNameSegment(0, 0, new IdentifierValue("t_order")));
+        deleteStatement.setTable(simpleTableSegment);
+        deleteStatement.setWhere(new WhereSegment(0, 0, new 
BinaryOperationExpression(0, 0, new ColumnSegment(0, 0, new 
IdentifierValue("status")),
+                new LiteralExpressionSegment(0, 0, 0), "=", "status = 1")));
+        DeleteStatement actual = new 
DeleteStatementBinder().bind(deleteStatement, createMetaData(), 
DefaultDatabase.LOGIC_NAME);
+        assertThat(actual, not(deleteStatement));
+        assertThat(actual.getTable(), not(deleteStatement.getTable()));
+        assertThat(actual.getTable(), instanceOf(SimpleTableSegment.class));
+        assertTrue(actual.getWhere().isPresent());
+        assertThat(actual.getWhere().get(), not(deleteStatement.getWhere()));
+        assertThat(actual.getWhere().get(), instanceOf(WhereSegment.class));
+        assertTrue(deleteStatement.getWhere().isPresent());
+        assertThat(actual.getWhere().get().getExpr(), 
not(deleteStatement.getWhere().get().getExpr()));
+        assertThat(actual.getWhere().get().getExpr(), 
instanceOf(BinaryOperationExpression.class));
+        assertThat(((BinaryOperationExpression) 
actual.getWhere().get().getExpr()).getLeft(), instanceOf(ColumnSegment.class));
+        assertThat(((ColumnSegment) ((BinaryOperationExpression) 
actual.getWhere().get().getExpr()).getLeft()).getColumnBoundedInfo().getOriginalTable().getValue(),
 is("t_order"));
+    }
+    
+    private ShardingSphereMetaData createMetaData() {
+        ShardingSphereSchema schema = mock(ShardingSphereSchema.class, 
RETURNS_DEEP_STUBS);
+        
when(schema.getTable("t_order").getColumnValues()).thenReturn(Arrays.asList(
+                new ShardingSphereColumn("order_id", Types.INTEGER, true, 
false, false, true, false, false),
+                new ShardingSphereColumn("user_id", Types.INTEGER, false, 
false, false, true, false, false),
+                new ShardingSphereColumn("status", Types.INTEGER, false, 
false, false, true, false, false)));
+        ShardingSphereMetaData result = mock(ShardingSphereMetaData.class, 
RETURNS_DEEP_STUBS);
+        
when(result.getDatabase(DefaultDatabase.LOGIC_NAME).getSchema(DefaultDatabase.LOGIC_NAME)).thenReturn(schema);
+        return result;
+    }
+}
diff --git 
a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/statement/UpdateStatementBinderTest.java
 
b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/statement/UpdateStatementBinderTest.java
new file mode 100644
index 00000000000..6dad29e3dad
--- /dev/null
+++ 
b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/statement/UpdateStatementBinderTest.java
@@ -0,0 +1,81 @@
+/*
+ * 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.statement;
+
+import 
org.apache.shardingsphere.infra.binder.statement.dml.UpdateStatementBinder;
+import org.apache.shardingsphere.infra.database.core.DefaultDatabase;
+import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
+import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereColumn;
+import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema;
+import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.column.ColumnSegment;
+import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.BinaryOperationExpression;
+import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.simple.LiteralExpressionSegment;
+import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.predicate.WhereSegment;
+import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.SimpleTableSegment;
+import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.TableNameSegment;
+import 
org.apache.shardingsphere.sql.parser.sql.common.statement.dml.UpdateStatement;
+import 
org.apache.shardingsphere.sql.parser.sql.common.value.identifier.IdentifierValue;
+import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.dml.MySQLUpdateStatement;
+import org.junit.jupiter.api.Test;
+
+import java.sql.Types;
+import java.util.Arrays;
+
+import static org.hamcrest.CoreMatchers.instanceOf;
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.not;
+import static org.hamcrest.MatcherAssert.assertThat;
+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;
+
+class UpdateStatementBinderTest {
+    
+    @Test
+    void assertBind() {
+        UpdateStatement updateStatement = new MySQLUpdateStatement();
+        SimpleTableSegment simpleTableSegment = new SimpleTableSegment(new 
TableNameSegment(0, 0, new IdentifierValue("t_order")));
+        updateStatement.setTable(simpleTableSegment);
+        updateStatement.setWhere(new WhereSegment(0, 0, new 
BinaryOperationExpression(0, 0, new ColumnSegment(0, 0, new 
IdentifierValue("status")),
+                new LiteralExpressionSegment(0, 0, 0), "=", "status = 1")));
+        UpdateStatement actual = new 
UpdateStatementBinder().bind(updateStatement, createMetaData(), 
DefaultDatabase.LOGIC_NAME);
+        assertThat(actual, not(updateStatement));
+        assertThat(actual.getTable(), not(updateStatement.getTable()));
+        assertThat(actual.getTable(), instanceOf(SimpleTableSegment.class));
+        assertTrue(actual.getWhere().isPresent());
+        assertThat(actual.getWhere().get(), not(updateStatement.getWhere()));
+        assertThat(actual.getWhere().get(), instanceOf(WhereSegment.class));
+        assertTrue(updateStatement.getWhere().isPresent());
+        assertThat(actual.getWhere().get().getExpr(), 
not(updateStatement.getWhere().get().getExpr()));
+        assertThat(actual.getWhere().get().getExpr(), 
instanceOf(BinaryOperationExpression.class));
+        assertThat(((BinaryOperationExpression) 
actual.getWhere().get().getExpr()).getLeft(), instanceOf(ColumnSegment.class));
+        assertThat(((ColumnSegment) ((BinaryOperationExpression) 
actual.getWhere().get().getExpr()).getLeft()).getColumnBoundedInfo().getOriginalTable().getValue(),
 is("t_order"));
+    }
+    
+    private ShardingSphereMetaData createMetaData() {
+        ShardingSphereSchema schema = mock(ShardingSphereSchema.class, 
RETURNS_DEEP_STUBS);
+        
when(schema.getTable("t_order").getColumnValues()).thenReturn(Arrays.asList(
+                new ShardingSphereColumn("order_id", Types.INTEGER, true, 
false, false, true, false, false),
+                new ShardingSphereColumn("user_id", Types.INTEGER, false, 
false, false, true, false, false),
+                new ShardingSphereColumn("status", Types.INTEGER, false, 
false, false, true, false, false)));
+        ShardingSphereMetaData result = mock(ShardingSphereMetaData.class, 
RETURNS_DEEP_STUBS);
+        
when(result.getDatabase(DefaultDatabase.LOGIC_NAME).getSchema(DefaultDatabase.LOGIC_NAME)).thenReturn(schema);
+        return result;
+    }
+}
diff --git 
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/handler/dml/DeleteStatementHandler.java
 
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/handler/dml/DeleteStatementHandler.java
index c590602a7e5..2ff9562b315 100644
--- 
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/handler/dml/DeleteStatementHandler.java
+++ 
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/handler/dml/DeleteStatementHandler.java
@@ -89,4 +89,52 @@ public final class DeleteStatementHandler implements 
SQLStatementHandler {
         }
         return Optional.empty();
     }
+    
+    /**
+     * Set order by segment.
+     *
+     * @param deleteStatement delete statement
+     * @param orderBySegment order by segment
+     */
+    public static void setOrderBySegment(final DeleteStatement 
deleteStatement, final OrderBySegment orderBySegment) {
+        if (deleteStatement instanceof MySQLStatement) {
+            ((MySQLDeleteStatement) 
deleteStatement).setOrderBy(orderBySegment);
+        }
+    }
+    
+    /**
+     * Set limit segment.
+     *
+     * @param deleteStatement delete statement
+     * @param limitSegment limit segment
+     */
+    public static void setLimitSegment(final DeleteStatement deleteStatement, 
final LimitSegment limitSegment) {
+        if (deleteStatement instanceof MySQLStatement) {
+            ((MySQLDeleteStatement) deleteStatement).setLimit(limitSegment);
+        }
+    }
+    
+    /**
+     * Set output segment.
+     *
+     * @param deleteStatement delete statement
+     * @param outputSegment output segment
+     */
+    public static void setOutputSegment(final DeleteStatement deleteStatement, 
final OutputSegment outputSegment) {
+        if (deleteStatement instanceof SQLServerStatement) {
+            ((SQLServerDeleteStatement) 
deleteStatement).setOutputSegment(outputSegment);
+        }
+    }
+    
+    /**
+     * Set with segment.
+     *
+     * @param deleteStatement delete statement
+     * @param withSegment with segment
+     */
+    public static void setWithSegment(final DeleteStatement deleteStatement, 
final WithSegment withSegment) {
+        if (deleteStatement instanceof SQLServerStatement) {
+            ((SQLServerDeleteStatement) 
deleteStatement).setWithSegment(withSegment);
+        }
+    }
 }
diff --git 
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/handler/dml/UpdateStatementHandler.java
 
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/handler/dml/UpdateStatementHandler.java
index 9918b671b0d..3eeea17682a 100644
--- 
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/handler/dml/UpdateStatementHandler.java
+++ 
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/handler/dml/UpdateStatementHandler.java
@@ -21,10 +21,13 @@ import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.order.OrderBySegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.pagination.limit.LimitSegment;
+import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.WithSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.statement.dml.UpdateStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.handler.SQLStatementHandler;
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.MySQLStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.dml.MySQLUpdateStatement;
+import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.sqlserver.SQLServerStatement;
+import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.sqlserver.dml.SQLServerUpdateStatement;
 
 import java.util.Optional;
 
@@ -59,4 +62,53 @@ public final class UpdateStatementHandler implements 
SQLStatementHandler {
         }
         return Optional.empty();
     }
+    
+    /**
+     * Get with segment.
+     *
+     * @param updateStatement update statement
+     * @return with segment
+     */
+    public static Optional<WithSegment> getWithSegment(final UpdateStatement 
updateStatement) {
+        if (updateStatement instanceof SQLServerStatement) {
+            return ((SQLServerUpdateStatement) 
updateStatement).getWithSegment();
+        }
+        return Optional.empty();
+    }
+    
+    /**
+     * Set order by segment.
+     * 
+     * @param updateStatement update statement
+     * @param orderBySegment order by segment
+     */
+    public static void setOrderBySegment(final UpdateStatement 
updateStatement, final OrderBySegment orderBySegment) {
+        if (updateStatement instanceof MySQLStatement) {
+            ((MySQLUpdateStatement) 
updateStatement).setOrderBy(orderBySegment);
+        }
+    }
+    
+    /**
+     * Set limit segment.
+     *
+     * @param updateStatement update statement
+     * @param limitSegment limit segment
+     */
+    public static void setLimitSegment(final UpdateStatement updateStatement, 
final LimitSegment limitSegment) {
+        if (updateStatement instanceof MySQLStatement) {
+            ((MySQLUpdateStatement) updateStatement).setLimit(limitSegment);
+        }
+    }
+    
+    /**
+     * Set with segment.
+     *
+     * @param updateStatement update statement
+     * @param withSegment with segment
+     */
+    public static void setWithSegment(final UpdateStatement updateStatement, 
final WithSegment withSegment) {
+        if (updateStatement instanceof SQLServerStatement) {
+            ((SQLServerUpdateStatement) 
updateStatement).setWithSegment(withSegment);
+        }
+    }
 }
diff --git 
a/proxy/backend/type/hbase/src/main/java/org/apache/shardingsphere/proxy/backend/hbase/handler/HBaseBackendUpdateHandler.java
 
b/proxy/backend/type/hbase/src/main/java/org/apache/shardingsphere/proxy/backend/hbase/handler/HBaseBackendUpdateHandler.java
index e8f7378d4f6..00c9ade5bdd 100644
--- 
a/proxy/backend/type/hbase/src/main/java/org/apache/shardingsphere/proxy/backend/hbase/handler/HBaseBackendUpdateHandler.java
+++ 
b/proxy/backend/type/hbase/src/main/java/org/apache/shardingsphere/proxy/backend/hbase/handler/HBaseBackendUpdateHandler.java
@@ -18,8 +18,8 @@
 package org.apache.shardingsphere.proxy.backend.hbase.handler;
 
 import lombok.RequiredArgsConstructor;
-import org.apache.shardingsphere.infra.binder.engine.SQLBindEngine;
 import 
org.apache.shardingsphere.infra.binder.context.statement.SQLStatementContext;
+import 
org.apache.shardingsphere.infra.binder.context.statement.SQLStatementContextFactory;
 import 
org.apache.shardingsphere.infra.executor.sql.execute.result.update.UpdateResult;
 import 
org.apache.shardingsphere.proxy.backend.handler.data.DatabaseBackendHandler;
 import 
org.apache.shardingsphere.proxy.backend.hbase.converter.HBaseOperationConverter;
@@ -48,7 +48,7 @@ public final class HBaseBackendUpdateHandler implements 
DatabaseBackendHandler {
      */
     @Override
     public UpdateResponseHeader execute() {
-        SQLStatementContext sqlStatementContext = new SQLBindEngine(null, 
"").bind(sqlStatement, Collections.emptyList());
+        SQLStatementContext sqlStatementContext = 
SQLStatementContextFactory.newInstance(null, Collections.emptyList(), 
sqlStatement, "");
         HBaseOperationConverter converter = 
HBaseOperationConverterFactory.newInstance(sqlStatementContext);
         Collection<UpdateResult> updateResults = 
updater.executeUpdate(converter.convert());
         return new UpdateResponseHeader(sqlStatement, updateResults);
diff --git 
a/proxy/backend/type/hbase/src/test/java/org/apache/shardingsphere/proxy/backend/hbase/converter/type/HBaseDeleteOperationConverterTest.java
 
b/proxy/backend/type/hbase/src/test/java/org/apache/shardingsphere/proxy/backend/hbase/converter/type/HBaseDeleteOperationConverterTest.java
index db1b3556dfd..c8a1e55bf28 100644
--- 
a/proxy/backend/type/hbase/src/test/java/org/apache/shardingsphere/proxy/backend/hbase/converter/type/HBaseDeleteOperationConverterTest.java
+++ 
b/proxy/backend/type/hbase/src/test/java/org/apache/shardingsphere/proxy/backend/hbase/converter/type/HBaseDeleteOperationConverterTest.java
@@ -18,8 +18,16 @@
 package org.apache.shardingsphere.proxy.backend.hbase.converter.type;
 
 import org.apache.hadoop.hbase.client.Delete;
-import org.apache.shardingsphere.infra.binder.engine.SQLBindEngine;
 import 
org.apache.shardingsphere.infra.binder.context.statement.SQLStatementContext;
+import org.apache.shardingsphere.infra.binder.engine.SQLBindEngine;
+import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
+import org.apache.shardingsphere.infra.database.core.DefaultDatabase;
+import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
+import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
+import 
org.apache.shardingsphere.infra.metadata.database.resource.ResourceMetaData;
+import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData;
+import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereColumn;
+import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereTable;
 import org.apache.shardingsphere.proxy.backend.hbase.bean.HBaseOperation;
 import 
org.apache.shardingsphere.proxy.backend.hbase.converter.HBaseOperationConverter;
 import 
org.apache.shardingsphere.proxy.backend.hbase.converter.HBaseOperationConverterFactory;
@@ -28,18 +36,23 @@ import 
org.apache.shardingsphere.proxy.backend.hbase.result.HBaseSupportedSQLSta
 import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
 import org.junit.jupiter.api.Test;
 
+import java.sql.Types;
 import java.util.Collections;
+import java.util.Map;
 
 import static org.hamcrest.CoreMatchers.instanceOf;
 import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.MatcherAssert.assertThat;
+import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
 
 class HBaseDeleteOperationConverterTest {
     
     @Test
     void assertConvert() {
         SQLStatement sqlStatement = 
HBaseSupportedSQLStatement.parseSQLStatement(HBaseSupportedSQLStatement.getDeleteStatement());
-        SQLStatementContext sqlStatementContext = new SQLBindEngine(null, 
"").bind(sqlStatement, Collections.emptyList());
+        SQLStatementContext sqlStatementContext = new 
SQLBindEngine(mockMetaData(), DefaultDatabase.LOGIC_NAME).bind(sqlStatement, 
Collections.emptyList());
         HBaseOperationConverter converter = 
HBaseOperationConverterFactory.newInstance(sqlStatementContext);
         HBaseOperation hbaseOperation = converter.convert();
         assertThat(hbaseOperation.getTableName(), 
is(HBaseSupportedSQLStatement.HBASE_DATABASE_TABLE_NAME));
@@ -50,11 +63,21 @@ class HBaseDeleteOperationConverterTest {
     void assertConvertWithIn() {
         String sql = " delete /*+ hbase */ from t_test_order where rowKey in 
('2', '1')";
         SQLStatement sqlStatement = 
HBaseSupportedSQLStatement.parseSQLStatement(sql);
-        SQLStatementContext sqlStatementContext = new SQLBindEngine(null, 
"").bind(sqlStatement, Collections.emptyList());
+        SQLStatementContext sqlStatementContext = new 
SQLBindEngine(mockMetaData(), DefaultDatabase.LOGIC_NAME).bind(sqlStatement, 
Collections.emptyList());
         HBaseOperationConverter converter = 
HBaseOperationConverterFactory.newInstance(sqlStatementContext);
         HBaseOperation hBaseOperation = converter.convert();
         assertThat(hBaseOperation.getTableName(), 
is(HBaseSupportedSQLStatement.HBASE_DATABASE_TABLE_NAME));
         assertThat(hBaseOperation.getOperation(), 
instanceOf(HBaseDeleteOperation.class));
         assertThat(((HBaseDeleteOperation) 
hBaseOperation.getOperation()).getDeletes().size(), is(2));
     }
+    
+    private ShardingSphereMetaData mockMetaData() {
+        ShardingSphereDatabase database = mock(ShardingSphereDatabase.class, 
RETURNS_DEEP_STUBS);
+        ShardingSphereTable table = new ShardingSphereTable("t_test_order", 
Collections.singletonList(new ShardingSphereColumn("rowKey", Types.VARCHAR, 
true, false, false, false, true, false)),
+                Collections.emptyList(), Collections.emptyList());
+        
when(database.getSchema(DefaultDatabase.LOGIC_NAME).getTable("t_test_order")).thenReturn(table);
+        Map<String, ShardingSphereDatabase> databases = 
Collections.singletonMap(DefaultDatabase.LOGIC_NAME, database);
+        return new ShardingSphereMetaData(databases, 
mock(ResourceMetaData.class), mock(RuleMetaData.class), 
mock(ConfigurationProperties.class));
+        
+    }
 }
diff --git 
a/proxy/backend/type/hbase/src/test/java/org/apache/shardingsphere/proxy/backend/hbase/converter/type/HBaseUpdateOperationConverterTest.java
 
b/proxy/backend/type/hbase/src/test/java/org/apache/shardingsphere/proxy/backend/hbase/converter/type/HBaseUpdateOperationConverterTest.java
index da9492c0227..46f24540b55 100644
--- 
a/proxy/backend/type/hbase/src/test/java/org/apache/shardingsphere/proxy/backend/hbase/converter/type/HBaseUpdateOperationConverterTest.java
+++ 
b/proxy/backend/type/hbase/src/test/java/org/apache/shardingsphere/proxy/backend/hbase/converter/type/HBaseUpdateOperationConverterTest.java
@@ -18,8 +18,16 @@
 package org.apache.shardingsphere.proxy.backend.hbase.converter.type;
 
 import org.apache.hadoop.hbase.client.Put;
-import org.apache.shardingsphere.infra.binder.engine.SQLBindEngine;
 import 
org.apache.shardingsphere.infra.binder.context.statement.SQLStatementContext;
+import org.apache.shardingsphere.infra.binder.engine.SQLBindEngine;
+import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
+import org.apache.shardingsphere.infra.database.core.DefaultDatabase;
+import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
+import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
+import 
org.apache.shardingsphere.infra.metadata.database.resource.ResourceMetaData;
+import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData;
+import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereColumn;
+import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereTable;
 import org.apache.shardingsphere.proxy.backend.hbase.bean.HBaseOperation;
 import 
org.apache.shardingsphere.proxy.backend.hbase.converter.HBaseOperationConverter;
 import 
org.apache.shardingsphere.proxy.backend.hbase.converter.HBaseOperationConverterFactory;
@@ -28,18 +36,24 @@ import 
org.apache.shardingsphere.proxy.backend.hbase.result.HBaseSupportedSQLSta
 import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
 import org.junit.jupiter.api.Test;
 
+import java.sql.Types;
+import java.util.Arrays;
 import java.util.Collections;
+import java.util.Map;
 
 import static org.hamcrest.CoreMatchers.instanceOf;
 import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.MatcherAssert.assertThat;
+import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
 
 class HBaseUpdateOperationConverterTest {
     
     @Test
     void assertConvert() {
         SQLStatement sqlStatement = 
HBaseSupportedSQLStatement.parseSQLStatement(HBaseSupportedSQLStatement.getUpdateStatement());
-        SQLStatementContext sqlStatementContext = new SQLBindEngine(null, 
"").bind(sqlStatement, Collections.emptyList());
+        SQLStatementContext sqlStatementContext = new 
SQLBindEngine(mockMetaData(), DefaultDatabase.LOGIC_NAME).bind(sqlStatement, 
Collections.emptyList());
         HBaseOperationConverter converter = 
HBaseOperationConverterFactory.newInstance(sqlStatementContext);
         HBaseOperation operation = converter.convert();
         assertThat(operation.getTableName(), 
is(HBaseSupportedSQLStatement.HBASE_DATABASE_TABLE_NAME));
@@ -50,11 +64,21 @@ class HBaseUpdateOperationConverterTest {
     void assertConvertWithIn() {
         String sql = " update /*+ hbase */ t_test_order set age = 10 where 
rowKey in (1, '2')";
         SQLStatement sqlStatement = 
HBaseSupportedSQLStatement.parseSQLStatement(sql);
-        SQLStatementContext sqlStatementContext = new SQLBindEngine(null, 
"").bind(sqlStatement, Collections.emptyList());
+        SQLStatementContext sqlStatementContext = new 
SQLBindEngine(mockMetaData(), DefaultDatabase.LOGIC_NAME).bind(sqlStatement, 
Collections.emptyList());
         HBaseOperationConverter converter = 
HBaseOperationConverterFactory.newInstance(sqlStatementContext);
         HBaseOperation operation = converter.convert();
         assertThat(operation.getTableName(), 
is(HBaseSupportedSQLStatement.HBASE_DATABASE_TABLE_NAME));
         assertThat(operation.getOperation(), 
instanceOf(HBaseUpdateOperation.class));
         assertThat(((HBaseUpdateOperation) 
operation.getOperation()).getPuts().size(), is(2));
     }
+    
+    private ShardingSphereMetaData mockMetaData() {
+        ShardingSphereDatabase database = mock(ShardingSphereDatabase.class, 
RETURNS_DEEP_STUBS);
+        ShardingSphereTable table = new ShardingSphereTable("t_test_order", 
Arrays.asList(new ShardingSphereColumn("rowKey", Types.VARCHAR, true, false, 
false, false, true, false),
+                new ShardingSphereColumn("age", Types.INTEGER, false, false, 
false, false, true, false)), Collections.emptyList(), Collections.emptyList());
+        
when(database.getSchema(DefaultDatabase.LOGIC_NAME).getTable("t_test_order")).thenReturn(table);
+        Map<String, ShardingSphereDatabase> databases = 
Collections.singletonMap(DefaultDatabase.LOGIC_NAME, database);
+        return new ShardingSphereMetaData(databases, 
mock(ResourceMetaData.class), mock(RuleMetaData.class), 
mock(ConfigurationProperties.class));
+        
+    }
 }
diff --git 
a/proxy/frontend/type/mysql/src/test/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/text/query/MySQLComQueryPacketExecutorTest.java
 
b/proxy/frontend/type/mysql/src/test/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/text/query/MySQLComQueryPacketExecutorTest.java
index a1bab10c0bc..f4097c49e09 100644
--- 
a/proxy/frontend/type/mysql/src/test/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/text/query/MySQLComQueryPacketExecutorTest.java
+++ 
b/proxy/frontend/type/mysql/src/test/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/text/query/MySQLComQueryPacketExecutorTest.java
@@ -26,7 +26,11 @@ import 
org.apache.shardingsphere.db.protocol.packet.DatabasePacket;
 import org.apache.shardingsphere.infra.config.props.ConfigurationPropertyKey;
 import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
+import 
org.apache.shardingsphere.infra.metadata.database.resource.ResourceMetaData;
 import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData;
+import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereColumn;
+import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema;
+import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereTable;
 import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
 import org.apache.shardingsphere.logging.rule.LoggingRule;
 import 
org.apache.shardingsphere.logging.rule.builder.DefaultLoggingRuleConfigurationBuilder;
@@ -57,6 +61,7 @@ import org.mockito.plugins.MemberAccessor;
 import org.mockito.quality.Strictness;
 
 import java.sql.SQLException;
+import java.sql.Types;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
@@ -142,8 +147,12 @@ class MySQLComQueryPacketExecutorTest {
         
when(result.getMetaData().getGlobalRuleMetaData()).thenReturn(globalRuleMetaData);
         
when(result.getMetaData().getProps().<Integer>getValue(ConfigurationPropertyKey.KERNEL_EXECUTOR_SIZE)).thenReturn(1);
         
when(result.getMetaData().getProps().<Boolean>getValue(ConfigurationPropertyKey.SQL_SHOW)).thenReturn(false);
-        ShardingSphereDatabase database = mock(ShardingSphereDatabase.class, 
RETURNS_DEEP_STUBS);
-        when(database.getRuleMetaData()).thenReturn(new 
RuleMetaData(Collections.emptyList()));
+        ShardingSphereTable table = new ShardingSphereTable("t", 
Arrays.asList(new ShardingSphereColumn("id", Types.BIGINT, true, false, false, 
false, true, false),
+                new ShardingSphereColumn("v", Types.INTEGER, false, false, 
false, false, true, false)), Collections.emptyList(), Collections.emptyList());
+        ShardingSphereSchema schema = new ShardingSphereSchema();
+        schema.getTables().put("t", table);
+        ShardingSphereDatabase database = new ShardingSphereDatabase("foo_db", 
TypedSPILoader.getService(DatabaseType.class, "MySQL"),
+                new ResourceMetaData("foo_db", Collections.emptyMap()), new 
RuleMetaData(Collections.emptyList()), Collections.singletonMap("foo_db", 
schema));
         when(result.getMetaData().getDatabase("foo_db")).thenReturn(database);
         return result;
         
diff --git 
a/proxy/frontend/type/mysql/src/test/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/text/query/MySQLMultiStatementsHandlerTest.java
 
b/proxy/frontend/type/mysql/src/test/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/text/query/MySQLMultiStatementsHandlerTest.java
index e413376a760..5c9db921a50 100644
--- 
a/proxy/frontend/type/mysql/src/test/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/text/query/MySQLMultiStatementsHandlerTest.java
+++ 
b/proxy/frontend/type/mysql/src/test/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/text/query/MySQLMultiStatementsHandlerTest.java
@@ -23,6 +23,8 @@ import 
org.apache.shardingsphere.infra.executor.sql.execute.engine.ConnectionMod
 import 
org.apache.shardingsphere.infra.executor.sql.prepare.driver.jdbc.StatementOption;
 import 
org.apache.shardingsphere.infra.metadata.database.resource.storage.StorageUnit;
 import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData;
+import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereColumn;
+import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereTable;
 import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
 import org.apache.shardingsphere.logging.rule.LoggingRule;
 import 
org.apache.shardingsphere.logging.rule.builder.DefaultLoggingRuleConfigurationBuilder;
@@ -48,6 +50,7 @@ import org.mockito.quality.Strictness;
 import java.sql.Connection;
 import java.sql.SQLException;
 import java.sql.Statement;
+import java.sql.Types;
 import java.util.Arrays;
 import java.util.Collections;
 
@@ -117,6 +120,9 @@ class MySQLMultiStatementsHandlerTest {
         
when(result.getMetaDataContexts().getMetaData().getProps().<Integer>getValue(ConfigurationPropertyKey.KERNEL_EXECUTOR_SIZE)).thenReturn(1);
         
when(result.getMetaDataContexts().getMetaData().getProps().<Boolean>getValue(ConfigurationPropertyKey.SQL_SHOW)).thenReturn(false);
         
when(result.getMetaDataContexts().getMetaData().getProps().<Integer>getValue(ConfigurationPropertyKey.MAX_CONNECTIONS_SIZE_PER_QUERY)).thenReturn(1);
+        ShardingSphereTable table = new ShardingSphereTable("t", 
Arrays.asList(new ShardingSphereColumn("id", Types.BIGINT, true, false, false, 
false, true, false),
+                new ShardingSphereColumn("v", Types.INTEGER, false, false, 
false, false, true, false)), Collections.emptyList(), Collections.emptyList());
+        
when(result.getMetaDataContexts().getMetaData().getDatabase("foo_db").getSchema("foo_db").getTable("t")).thenReturn(table);
         return result;
     }
 }
diff --git 
a/proxy/frontend/type/postgresql/src/test/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/parse/PostgreSQLComParseExecutorTest.java
 
b/proxy/frontend/type/postgresql/src/test/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/parse/PostgreSQLComParseExecutorTest.java
index 89d113b907f..9f6cce134db 100644
--- 
a/proxy/frontend/type/postgresql/src/test/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/parse/PostgreSQLComParseExecutorTest.java
+++ 
b/proxy/frontend/type/postgresql/src/test/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/parse/PostgreSQLComParseExecutorTest.java
@@ -25,7 +25,12 @@ import 
org.apache.shardingsphere.distsql.parser.statement.ral.queryable.ShowDist
 import 
org.apache.shardingsphere.infra.binder.context.statement.CommonSQLStatementContext;
 import 
org.apache.shardingsphere.infra.binder.context.statement.dml.InsertStatementContext;
 import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
+import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
+import 
org.apache.shardingsphere.infra.metadata.database.resource.ResourceMetaData;
 import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData;
+import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereColumn;
+import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema;
+import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereTable;
 import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
 import org.apache.shardingsphere.mode.manager.ContextManager;
 import org.apache.shardingsphere.parser.rule.SQLParserRule;
@@ -45,7 +50,10 @@ import org.junit.jupiter.api.extension.ExtendWith;
 import org.mockito.InjectMocks;
 import org.mockito.Mock;
 import org.mockito.internal.configuration.plugins.Plugins;
+import org.mockito.junit.jupiter.MockitoSettings;
+import org.mockito.quality.Strictness;
 
+import java.sql.Types;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
@@ -59,6 +67,7 @@ import static org.mockito.Mockito.when;
 
 @ExtendWith(AutoMockExtension.class)
 @StaticMockSettings(ProxyContext.class)
+@MockitoSettings(strictness = Strictness.LENIENT)
 class PostgreSQLComParseExecutorTest {
     
     @Mock
@@ -74,6 +83,7 @@ class PostgreSQLComParseExecutorTest {
     void setup() {
         
when(connectionSession.getServerPreparedStatementRegistry()).thenReturn(new 
ServerPreparedStatementRegistry());
         when(connectionSession.getDatabaseName()).thenReturn("foo_db");
+        when(connectionSession.getDefaultDatabaseName()).thenReturn("foo_db");
     }
     
     @Test
@@ -172,6 +182,14 @@ class PostgreSQLComParseExecutorTest {
         
when(result.getMetaDataContexts().getMetaData().getDatabase("foo_db").getProtocolType()).thenReturn(TypedSPILoader.getService(DatabaseType.class,
 "PostgreSQL"));
         
when(result.getMetaDataContexts().getMetaData().getGlobalRuleMetaData())
                 .thenReturn(new RuleMetaData(Collections.singleton(new 
SQLParserRule(new DefaultSQLParserRuleConfigurationBuilder().build()))));
+        ShardingSphereTable table = new ShardingSphereTable("t_test", 
Arrays.asList(new ShardingSphereColumn("id", Types.BIGINT, true, false, false, 
false, true, false),
+                new ShardingSphereColumn("name", Types.VARCHAR, false, false, 
false, false, false, false),
+                new ShardingSphereColumn("age", Types.SMALLINT, false, false, 
false, false, true, false)), Collections.emptyList(), Collections.emptyList());
+        ShardingSphereSchema schema = new ShardingSphereSchema();
+        schema.getTables().put("t_test", table);
+        ShardingSphereDatabase database = new ShardingSphereDatabase("foo_db", 
TypedSPILoader.getService(DatabaseType.class, "PostgreSQL"),
+                new ResourceMetaData("foo_db", Collections.emptyMap()), new 
RuleMetaData(Collections.emptyList()), Collections.singletonMap("public", 
schema));
+        
when(result.getMetaDataContexts().getMetaData().getDatabase("foo_db")).thenReturn(database);
         return result;
     }
 }
diff --git 
a/test/it/rewriter/src/test/resources/scenario/sharding/case/dml/delete.xml 
b/test/it/rewriter/src/test/resources/scenario/sharding/case/dml/delete.xml
index b62e9963e37..922bfa12ceb 100644
--- a/test/it/rewriter/src/test/resources/scenario/sharding/case/dml/delete.xml
+++ b/test/it/rewriter/src/test/resources/scenario/sharding/case/dml/delete.xml
@@ -28,13 +28,13 @@
     </rewrite-assertion>
     
     <rewrite-assertion id="delete_without_sharding_value_for_parameters" 
db-types="MySQL,Oracle,SQLServer,SQL92">
-        <input sql="DELETE FROM sharding_db.t_account WHERE status = ?" 
parameters="OK" />
+        <input sql="DELETE FROM logic_db.t_account WHERE status = ?" 
parameters="OK" />
         <output sql="DELETE FROM t_account_0 WHERE status = ?" parameters="OK" 
/>
         <output sql="DELETE FROM t_account_1 WHERE status = ?" parameters="OK" 
/>
     </rewrite-assertion>
     
     <rewrite-assertion id="delete_without_sharding_value_for_literals" 
db-types="MySQL,Oracle,SQLServer,SQL92">
-        <input sql="DELETE FROM sharding_db.t_account WHERE status = 'OK'" />
+        <input sql="DELETE FROM logic_db.t_account WHERE status = 'OK'" />
         <output sql="DELETE FROM t_account_0 WHERE status = 'OK'" />
         <output sql="DELETE FROM t_account_1 WHERE status = 'OK'" />
     </rewrite-assertion>

Reply via email to