This is an automated email from the ASF dual-hosted git repository.

diqiu50 pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/gravitino.git


The following commit(s) were added to refs/heads/main by this push:
     new eeb0db55e9 [#8198] Improvement(trino-connector): prevent NPE in 
GravitinoConnector (#8246)
eeb0db55e9 is described below

commit eeb0db55e9deb5cb27ff2f334c6d572ebe3c0b4e
Author: Sambhavi Pandey <[email protected]>
AuthorDate: Thu Aug 28 14:20:51 2025 +0530

    [#8198] Improvement(trino-connector): prevent NPE in GravitinoConnector 
(#8246)
    
    <!--
    1. Title: [#<issue>] <type>(<scope>): <subject>
       Examples:
         - "[#123] feat(operator): support xxx"
         - "[#233] fix: check null before access result in xxx"
         - "[MINOR] refactor: fix typo in variable name"
         - "[MINOR] docs: fix typo in README"
         - "[#255] test: fix flaky test NameOfTheTest"
       Reference: https://www.conventionalcommits.org/en/v1.0.0/
    2. If the PR is unfinished, please mark this PR as draft.
    -->
    
    ### What changes were proposed in this pull request?
    To fix possible NPEs in GravitinoConnector.java, added
    Preconditions.checkNotNull for internalConnector and transaction handle
    in beginTransaction method before their use.
    
    
    ### Why are the changes needed?
    An Improvement to prevent possible NPEs in GravitinoConnector.java
    
    Fix: #8198
    
    ### Does this PR introduce _any_ user-facing change?
    
    No
    
    ### How was this patch tested?
    Unit testing
    
    ---------
    
    Co-authored-by: Justin Mclean <[email protected]>
    Co-authored-by: Yuhui <[email protected]>
---
 .../trino/connector/GravitinoConnector.java        |  3 +-
 .../TestGravitinoConnectorNullChecks.java          | 56 ++++++++++++++++++++++
 2 files changed, 58 insertions(+), 1 deletion(-)

diff --git 
a/trino-connector/trino-connector/src/main/java/org/apache/gravitino/trino/connector/GravitinoConnector.java
 
b/trino-connector/trino-connector/src/main/java/org/apache/gravitino/trino/connector/GravitinoConnector.java
index 069c795dd5..2bd489ec6d 100644
--- 
a/trino-connector/trino-connector/src/main/java/org/apache/gravitino/trino/connector/GravitinoConnector.java
+++ 
b/trino-connector/trino-connector/src/main/java/org/apache/gravitino/trino/connector/GravitinoConnector.java
@@ -65,10 +65,11 @@ public class GravitinoConnector implements Connector {
   public ConnectorTransactionHandle beginTransaction(
       IsolationLevel isolationLevel, boolean readOnly, boolean autoCommit) {
     Connector internalConnector = 
catalogConnectorContext.getInternalConnector();
+    Preconditions.checkNotNull(internalConnector, "Internal connector must not 
be null");
 
     ConnectorTransactionHandle internalTransactionHandler =
         internalConnector.beginTransaction(isolationLevel, readOnly, 
autoCommit);
-    Preconditions.checkNotNull(internalConnector);
+    Preconditions.checkNotNull(internalTransactionHandler, "Transaction 
handler must not be null");
 
     return new GravitinoTransactionHandle(internalTransactionHandler);
   }
diff --git 
a/trino-connector/trino-connector/src/test/java/org/apache/gravitino/trino/connector/TestGravitinoConnectorNullChecks.java
 
b/trino-connector/trino-connector/src/test/java/org/apache/gravitino/trino/connector/TestGravitinoConnectorNullChecks.java
new file mode 100644
index 0000000000..d11d9cbfac
--- /dev/null
+++ 
b/trino-connector/trino-connector/src/test/java/org/apache/gravitino/trino/connector/TestGravitinoConnectorNullChecks.java
@@ -0,0 +1,56 @@
+/*
+ * 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 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.gravitino.trino.connector;
+
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyBoolean;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import io.trino.spi.connector.Connector;
+import io.trino.spi.transaction.IsolationLevel;
+import org.apache.gravitino.NameIdentifier;
+import org.apache.gravitino.trino.connector.catalog.CatalogConnectorContext;
+import org.junit.jupiter.api.Test;
+
+class TestGravitinoConnectorNullChecks {
+  @Test
+  void testBeginTransactionThrowsIfInternalConnectorIsNull() {
+    CatalogConnectorContext mockContext = mock(CatalogConnectorContext.class);
+    when(mockContext.getInternalConnector()).thenReturn(null);
+    GravitinoConnector connector = new 
GravitinoConnector(mock(NameIdentifier.class), mockContext);
+    assertThrows(
+        NullPointerException.class,
+        () -> connector.beginTransaction(IsolationLevel.READ_COMMITTED, true, 
true));
+  }
+
+  @Test
+  void testBeginTransactionThrowsIfInternalTransactionHandleIsNull() {
+    CatalogConnectorContext mockContext = mock(CatalogConnectorContext.class);
+    Connector mockInternalConnector = mock(Connector.class);
+    when(mockContext.getInternalConnector()).thenReturn(mockInternalConnector);
+    when(mockInternalConnector.beginTransaction(any(), anyBoolean(), 
anyBoolean()))
+        .thenReturn(null);
+    GravitinoConnector connector = new 
GravitinoConnector(mock(NameIdentifier.class), mockContext);
+    assertThrows(
+        NullPointerException.class,
+        () -> connector.beginTransaction(IsolationLevel.READ_COMMITTED, true, 
true));
+  }
+}

Reply via email to