You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by yx...@apache.org on 2022/10/19 15:11:57 UTC
[shardingsphere] branch master updated: Fix null exception for #19814 (#21647)
This is an automated email from the ASF dual-hosted git repository.
yx9o 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 8f9e1858e29 Fix null exception for #19814 (#21647)
8f9e1858e29 is described below
commit 8f9e1858e29c33398f2ea95f6b1b50ef9cf03cfd
Author: Raigor <ra...@gmail.com>
AuthorDate: Wed Oct 19 23:11:42 2022 +0800
Fix null exception for #19814 (#21647)
* Fixes #19814, throw SchemaNotFoundException when there is no target schame.
* Update format.
* Update format.
---
.../segment/select/projection/engine/ProjectionEngine.java | 8 ++++++--
.../select/projection/engine/ProjectionEngineTest.java | 14 +++++++++++++-
.../infra}/exception/SchemaNotFoundException.java | 3 +--
.../ddl/SingleTableDropSchemaMetadataValidator.java | 2 +-
.../ddl/SingleTableDropSchemaMetadataValidatorTest.java | 2 +-
5 files changed, 22 insertions(+), 7 deletions(-)
diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/select/projection/engine/ProjectionEngine.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/select/projection/engine/ProjectionEngine.java
index 0241e017595..ce61e1aee6b 100644
--- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/select/projection/engine/ProjectionEngine.java
+++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/select/projection/engine/ProjectionEngine.java
@@ -29,7 +29,9 @@ import org.apache.shardingsphere.infra.binder.segment.select.projection.impl.Sho
import org.apache.shardingsphere.infra.binder.segment.select.projection.impl.SubqueryProjection;
import org.apache.shardingsphere.infra.database.type.DatabaseType;
import org.apache.shardingsphere.infra.database.type.DatabaseTypeEngine;
+import org.apache.shardingsphere.infra.exception.SchemaNotFoundException;
import org.apache.shardingsphere.infra.metadata.database.schema.decorator.model.ShardingSphereSchema;
+import org.apache.shardingsphere.infra.util.exception.ShardingSpherePreconditions;
import org.apache.shardingsphere.sql.parser.sql.common.constant.AggregationType;
import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.simple.ParameterMarkerExpressionSegment;
import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.AggregationDistinctProjectionSegment;
@@ -158,11 +160,13 @@ public final class ProjectionEngine {
String tableAlias = table.getAlias().orElse(tableName);
String schemaName = ((SimpleTableSegment) table).getOwner().map(optional -> optional.getIdentifier().getValue())
.orElseGet(() -> DatabaseTypeEngine.getDefaultSchemaName(databaseType, databaseName)).toLowerCase();
+ ShardingSphereSchema schema = schemas.get(schemaName);
+ ShardingSpherePreconditions.checkNotNull(schema, () -> new SchemaNotFoundException(schemaName));
Collection<ColumnProjection> result = new LinkedList<>();
if (null == owner) {
- schemas.get(schemaName).getVisibleColumnNames(tableName).stream().map(each -> new ColumnProjection(tableAlias, each, null)).forEach(result::add);
+ schema.getVisibleColumnNames(tableName).stream().map(each -> new ColumnProjection(tableAlias, each, null)).forEach(result::add);
} else if (owner.equalsIgnoreCase(tableAlias)) {
- schemas.get(schemaName).getVisibleColumnNames(tableName).stream().map(each -> new ColumnProjection(owner, each, null)).forEach(result::add);
+ schema.getVisibleColumnNames(tableName).stream().map(each -> new ColumnProjection(owner, each, null)).forEach(result::add);
}
return result;
}
diff --git a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/segment/select/projection/engine/ProjectionEngineTest.java b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/segment/select/projection/engine/ProjectionEngineTest.java
index 9803093d1aa..84cbdd51a2a 100644
--- a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/segment/select/projection/engine/ProjectionEngineTest.java
+++ b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/segment/select/projection/engine/ProjectionEngineTest.java
@@ -26,6 +26,7 @@ import org.apache.shardingsphere.infra.binder.segment.select.projection.impl.Par
import org.apache.shardingsphere.infra.binder.segment.select.projection.impl.ShorthandProjection;
import org.apache.shardingsphere.infra.database.DefaultDatabase;
import org.apache.shardingsphere.infra.database.type.DatabaseType;
+import org.apache.shardingsphere.infra.exception.SchemaNotFoundException;
import org.apache.shardingsphere.infra.metadata.database.schema.decorator.model.ShardingSphereSchema;
import org.apache.shardingsphere.sql.parser.sql.common.constant.AggregationType;
import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.column.ColumnSegment;
@@ -56,9 +57,10 @@ import java.util.Optional;
import static org.hamcrest.CoreMatchers.instanceOf;
import static org.hamcrest.CoreMatchers.is;
-import static org.junit.Assert.assertFalse;
import static org.hamcrest.MatcherAssert.assertThat;
+import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
@@ -189,4 +191,14 @@ public final class ProjectionEngineTest {
assertThat(actualColumns.get("t_order.customer_id"), is(new ColumnProjection("t_order", "customer_id", null)));
assertThat(actualColumns.get("t_customer.customer_id"), is(new ColumnProjection("t_customer", "customer_id", null)));
}
+
+ @Test(expected = SchemaNotFoundException.class)
+ public void assertCreateProjectionWithNotExistedSchema() {
+ SimpleTableSegment tableSegment = mock(SimpleTableSegment.class, RETURNS_DEEP_STUBS);
+ OwnerSegment ownerSegment = mock(OwnerSegment.class, RETURNS_DEEP_STUBS);
+ when(tableSegment.getOwner()).thenReturn(Optional.of(ownerSegment));
+ when(ownerSegment.getIdentifier().getValue()).thenReturn("public");
+ ShorthandProjectionSegment shorthandProjectionSegment = new ShorthandProjectionSegment(0, 0);
+ new ProjectionEngine(DefaultDatabase.LOGIC_NAME, Collections.singletonMap(DefaultDatabase.LOGIC_NAME, schema), databaseType).createProjection(tableSegment, shorthandProjectionSegment);
+ }
}
diff --git a/kernel/single-table/core/src/main/java/org/apache/shardingsphere/singletable/exception/SchemaNotFoundException.java b/infra/common/src/main/java/org/apache/shardingsphere/infra/exception/SchemaNotFoundException.java
similarity index 90%
rename from kernel/single-table/core/src/main/java/org/apache/shardingsphere/singletable/exception/SchemaNotFoundException.java
rename to infra/common/src/main/java/org/apache/shardingsphere/infra/exception/SchemaNotFoundException.java
index f74e47a3dce..7d873abb004 100644
--- a/kernel/single-table/core/src/main/java/org/apache/shardingsphere/singletable/exception/SchemaNotFoundException.java
+++ b/infra/common/src/main/java/org/apache/shardingsphere/infra/exception/SchemaNotFoundException.java
@@ -15,9 +15,8 @@
* limitations under the License.
*/
-package org.apache.shardingsphere.singletable.exception;
+package org.apache.shardingsphere.infra.exception;
-import org.apache.shardingsphere.infra.exception.MetaDataSQLException;
import org.apache.shardingsphere.infra.util.exception.external.sql.sqlstate.XOpenSQLState;
/**
diff --git a/kernel/single-table/core/src/main/java/org/apache/shardingsphere/singletable/route/validator/ddl/SingleTableDropSchemaMetadataValidator.java b/kernel/single-table/core/src/main/java/org/apache/shardingsphere/singletable/route/validator/ddl/SingleTableDropSchemaMetadataValidator.java
index 2ab5a87d1ff..c13e7582fe0 100644
--- a/kernel/single-table/core/src/main/java/org/apache/shardingsphere/singletable/route/validator/ddl/SingleTableDropSchemaMetadataValidator.java
+++ b/kernel/single-table/core/src/main/java/org/apache/shardingsphere/singletable/route/validator/ddl/SingleTableDropSchemaMetadataValidator.java
@@ -18,11 +18,11 @@
package org.apache.shardingsphere.singletable.route.validator.ddl;
import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
+import org.apache.shardingsphere.infra.exception.SchemaNotFoundException;
import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
import org.apache.shardingsphere.infra.metadata.database.schema.decorator.model.ShardingSphereSchema;
import org.apache.shardingsphere.infra.util.exception.ShardingSpherePreconditions;
import org.apache.shardingsphere.singletable.exception.DropNotEmptySchemaException;
-import org.apache.shardingsphere.singletable.exception.SchemaNotFoundException;
import org.apache.shardingsphere.singletable.route.validator.SingleTableMetadataValidator;
import org.apache.shardingsphere.singletable.rule.SingleTableRule;
import org.apache.shardingsphere.sql.parser.sql.common.statement.ddl.DropSchemaStatement;
diff --git a/kernel/single-table/core/src/test/java/org/apache/shardingsphere/singletable/route/validator/ddl/SingleTableDropSchemaMetadataValidatorTest.java b/kernel/single-table/core/src/test/java/org/apache/shardingsphere/singletable/route/validator/ddl/SingleTableDropSchemaMetadataValidatorTest.java
index 3482e44cd5b..4b401230d6d 100644
--- a/kernel/single-table/core/src/test/java/org/apache/shardingsphere/singletable/route/validator/ddl/SingleTableDropSchemaMetadataValidatorTest.java
+++ b/kernel/single-table/core/src/test/java/org/apache/shardingsphere/singletable/route/validator/ddl/SingleTableDropSchemaMetadataValidatorTest.java
@@ -19,11 +19,11 @@ package org.apache.shardingsphere.singletable.route.validator.ddl;
import org.apache.shardingsphere.infra.binder.statement.CommonSQLStatementContext;
import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
+import org.apache.shardingsphere.infra.exception.SchemaNotFoundException;
import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
import org.apache.shardingsphere.infra.metadata.database.schema.decorator.model.ShardingSphereSchema;
import org.apache.shardingsphere.infra.metadata.database.schema.decorator.model.ShardingSphereTable;
import org.apache.shardingsphere.singletable.exception.DropNotEmptySchemaException;
-import org.apache.shardingsphere.singletable.exception.SchemaNotFoundException;
import org.apache.shardingsphere.singletable.rule.SingleTableRule;
import org.apache.shardingsphere.sql.parser.sql.common.statement.ddl.DropSchemaStatement;
import org.apache.shardingsphere.sql.parser.sql.common.value.identifier.IdentifierValue;