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

Reply via email to