This is an automated email from the ASF dual-hosted git repository.
tuichenchuxin 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 b1c9bab2eea Fix npe when execute mysql system table query with sql
federation (#28373)
b1c9bab2eea is described below
commit b1c9bab2eeab5f62dd62ec8c75efb8525edbba9c
Author: Zhengqiang Duan <[email protected]>
AuthorDate: Wed Sep 6 16:53:14 2023 +0800
Fix npe when execute mysql system table query with sql federation (#28373)
---
.../compiler/metadata/schema/SQLFederationTable.java | 16 ++++++++++++++++
.../resultset/SQLFederationResultSetMetaData.java | 2 +-
2 files changed, 17 insertions(+), 1 deletion(-)
diff --git
a/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/metadata/schema/SQLFederationTable.java
b/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/metadata/schema/SQLFederationTable.java
index 9d877a3a627..c3ed10d7ad5 100644
---
a/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/metadata/schema/SQLFederationTable.java
+++
b/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/metadata/schema/SQLFederationTable.java
@@ -20,7 +20,9 @@ package
org.apache.shardingsphere.sqlfederation.compiler.metadata.schema;
import lombok.RequiredArgsConstructor;
import lombok.Setter;
import org.apache.calcite.DataContext;
+import org.apache.calcite.linq4j.AbstractEnumerable;
import org.apache.calcite.linq4j.Enumerable;
+import org.apache.calcite.linq4j.Enumerator;
import org.apache.calcite.linq4j.QueryProvider;
import org.apache.calcite.linq4j.Queryable;
import org.apache.calcite.linq4j.tree.Expression;
@@ -43,6 +45,7 @@ import
org.apache.shardingsphere.sqlfederation.compiler.metadata.util.SQLFederat
import
org.apache.shardingsphere.sqlfederation.compiler.statistic.SQLFederationStatistic;
import
org.apache.shardingsphere.sqlfederation.executor.enumerable.EnumerableScanExecutor;
import
org.apache.shardingsphere.sqlfederation.executor.enumerable.EnumerableScanExecutorContext;
+import org.apache.shardingsphere.sqlfederation.executor.row.EmptyRowEnumerator;
import java.lang.reflect.Type;
import java.util.Collections;
@@ -96,9 +99,22 @@ public final class SQLFederationTable extends AbstractTable
implements Queryable
* @return enumerable result
*/
public Enumerable<Object> execute(final DataContext root, final String
sql, final int[] paramIndexes) {
+ if (null == scanExecutor) {
+ return createEmptyEnumerable();
+ }
return scanExecutor.execute(table, new
EnumerableScanExecutorContext(root, sql, paramIndexes));
}
+ private AbstractEnumerable<Object> createEmptyEnumerable() {
+ return new AbstractEnumerable<Object>() {
+
+ @Override
+ public Enumerator<Object> enumerator() {
+ return new EmptyRowEnumerator();
+ }
+ };
+ }
+
@Override
public String toString() {
return "SQLFederationTable";
diff --git
a/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/resultset/SQLFederationResultSetMetaData.java
b/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/resultset/SQLFederationResultSetMetaData.java
index 9e122e7236f..a91af4933a9 100644
---
a/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/resultset/SQLFederationResultSetMetaData.java
+++
b/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/resultset/SQLFederationResultSetMetaData.java
@@ -181,7 +181,7 @@ public final class SQLFederationResultSetMetaData extends
WrapperAdapter impleme
expandProjections.size() < column ? new ColumnProjection(null,
resultColumnType.getFieldList().get(column - 1).getName(), null,
selectStatementContext.getDatabaseType())
: expandProjections.get(column - 1);
if (projection instanceof ColumnProjection) {
- return Optional.of(((ColumnProjection)
projection).getOriginalTable().getValue());
+ return Optional.ofNullable(((ColumnProjection)
projection).getOriginalTable().getValue());
}
return Optional.empty();
}