[IOTDB-912] Implement wasNull method in AbstractIoTDBJDBCResultSet (#1791)

diff --git a/jdbc/src/main/java/org/apache/iotdb/jdbc/AbstractIoTDBJDBCResultSet.java b/jdbc/src/main/java/org/apache/iotdb/jdbc/AbstractIoTDBJDBCResultSet.java
index 28e63fd..99c300f 100644
--- a/jdbc/src/main/java/org/apache/iotdb/jdbc/AbstractIoTDBJDBCResultSet.java
+++ b/jdbc/src/main/java/org/apache/iotdb/jdbc/AbstractIoTDBJDBCResultSet.java
@@ -160,7 +160,12 @@
 
   @Override
   public BigDecimal getBigDecimal(String columnName) throws SQLException {
-    return new BigDecimal(Objects.requireNonNull(getValueByName(columnName)));
+    String value = getValueByName(columnName);
+    if (value != null) {
+      return new BigDecimal(value);
+    } else {
+      return null;
+    }
   }
 
   @Override
@@ -480,16 +485,12 @@
 
   @Override
   public short getShort(int columnIndex) throws SQLException {
-    try {
-      return getShort(ioTDBRpcDataSet.findColumnNameByIndex(columnIndex));
-    } catch (StatementExecutionException e) {
-      throw new SQLException(e.getMessage());
-    }
+    throw new SQLException(Constant.METHOD_NOT_SUPPORTED);
   }
 
   @Override
   public short getShort(String columnName) throws SQLException {
-    return Short.parseShort(Objects.requireNonNull(getValueByName(columnName)));
+    throw new SQLException(Constant.METHOD_NOT_SUPPORTED);
   }
 
   @Override
@@ -1099,8 +1100,8 @@
   }
 
   @Override
-  public boolean wasNull() throws SQLException {
-    throw new SQLException(Constant.METHOD_NOT_SUPPORTED);
+  public boolean wasNull() {
+    return ioTDBRpcDataSet.lastReadWasNull;
   }
 
   abstract void checkRecord() throws SQLException;
diff --git a/jdbc/src/main/java/org/apache/iotdb/jdbc/IoTDBNonAlignJDBCResultSet.java b/jdbc/src/main/java/org/apache/iotdb/jdbc/IoTDBNonAlignJDBCResultSet.java
index 3b3aaa3..dd0b513 100644
--- a/jdbc/src/main/java/org/apache/iotdb/jdbc/IoTDBNonAlignJDBCResultSet.java
+++ b/jdbc/src/main/java/org/apache/iotdb/jdbc/IoTDBNonAlignJDBCResultSet.java
@@ -89,16 +89,20 @@
       String column = columnName.substring(TIMESTAMP_STR_LENGTH);
       int index = ioTDBRpcDataSet.columnOrdinalMap.get(column) - START_INDEX;
       if (times[index] != null) {
+        ioTDBRpcDataSet.lastReadWasNull = false;
         return BytesUtils.bytesToLong(times[index]);
       } else {
-        throw new SQLException(String.format(VALUE_IS_NULL, columnName));
+        ioTDBRpcDataSet.lastReadWasNull = true;
+        return 0;
       }
     }
     int index = ioTDBRpcDataSet.columnOrdinalMap.get(columnName) - START_INDEX;
     if (ioTDBRpcDataSet.values[index] != null) {
+      ioTDBRpcDataSet.lastReadWasNull = false;
       return BytesUtils.bytesToLong(ioTDBRpcDataSet.values[index]);
     } else {
-      throw new SQLException(String.format(VALUE_IS_NULL, columnName));
+      ioTDBRpcDataSet.lastReadWasNull = true;
+      return 0;
     }
   }
 
diff --git a/service-rpc/src/main/java/org/apache/iotdb/rpc/IoTDBRpcDataSet.java b/service-rpc/src/main/java/org/apache/iotdb/rpc/IoTDBRpcDataSet.java
index c4f495d..95b91282 100644
--- a/service-rpc/src/main/java/org/apache/iotdb/rpc/IoTDBRpcDataSet.java
+++ b/service-rpc/src/main/java/org/apache/iotdb/rpc/IoTDBRpcDataSet.java
@@ -54,6 +54,7 @@
   public int fetchSize;
   public boolean emptyResultSet = false;
   public boolean hasCachedRecord = false;
+  public boolean lastReadWasNull;
 
 
   public byte[][] values; // used to cache the current row record value
@@ -284,9 +285,11 @@
     checkRecord();
     int index = columnOrdinalMap.get(columnName) - START_INDEX;
     if (!isNull(index, rowsIndex - 1)) {
+      lastReadWasNull = false;
       return BytesUtils.bytesToBool(values[index]);
     } else {
-      throw new StatementExecutionException(String.format(VALUE_IS_NULL, columnName));
+      lastReadWasNull = true;
+      return false;
     }
   }
 
@@ -298,9 +301,11 @@
     checkRecord();
     int index = columnOrdinalMap.get(columnName) - START_INDEX;
     if (!isNull(index, rowsIndex - 1)) {
+      lastReadWasNull = false;
       return BytesUtils.bytesToDouble(values[index]);
     } else {
-      throw new StatementExecutionException(String.format(VALUE_IS_NULL, columnName));
+      lastReadWasNull = true;
+      return 0;
     }
   }
 
@@ -312,9 +317,11 @@
     checkRecord();
     int index = columnOrdinalMap.get(columnName) - START_INDEX;
     if (!isNull(index, rowsIndex - 1)) {
+      lastReadWasNull = false;
       return BytesUtils.bytesToFloat(values[index]);
     } else {
-      throw new StatementExecutionException(String.format(VALUE_IS_NULL, columnName));
+      lastReadWasNull = true;
+      return 0;
     }
   }
 
@@ -326,9 +333,11 @@
     checkRecord();
     int index = columnOrdinalMap.get(columnName) - START_INDEX;
     if (!isNull(index, rowsIndex - 1)) {
+      lastReadWasNull = false;
       return BytesUtils.bytesToInt(values[index]);
     } else {
-      throw new StatementExecutionException(String.format(VALUE_IS_NULL, columnName));
+      lastReadWasNull = true;
+      return 0;
     }
   }
 
@@ -343,9 +352,11 @@
     }
     int index = columnOrdinalMap.get(columnName) - START_INDEX;
     if (!isNull(index, rowsIndex - 1)) {
+      lastReadWasNull = false;
       return BytesUtils.bytesToLong(values[index]);
     } else {
-      throw new StatementExecutionException(String.format(VALUE_IS_NULL, columnName));
+      lastReadWasNull = true;
+      return 0;
     }
   }
 
@@ -384,8 +395,10 @@
     }
     int index = columnOrdinalMap.get(columnName) - START_INDEX;
     if (index < 0 || index >= values.length || isNull(index, rowsIndex - 1)) {
+      lastReadWasNull = true;
       return null;
     }
+    lastReadWasNull = false;
     return getString(index, columnTypeDeduplicatedList.get(index), values);
   }