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>