pgyori commented on a change in pull request #5388:
URL: https://github.com/apache/nifi/pull/5388#discussion_r714791631



##########
File path: 
nifi-commons/nifi-record/src/main/java/org/apache/nifi/serialization/record/ResultSetRecordSet.java
##########
@@ -298,7 +272,67 @@ private DataType getDataType(final int sqlType, final 
ResultSet rs, final int co
         }
     }
 
-    private static DataType getArrayBaseType(final Array array) throws 
SQLException {
+    private DataType determineDataTypeToReturn(final DataType dataType, final 
boolean useLogicalTypes) {
+        RecordFieldType fieldType = dataType.getFieldType();
+        if (!useLogicalTypes
+                && (fieldType == RecordFieldType.DECIMAL
+                || fieldType == RecordFieldType.DATE
+                || fieldType == RecordFieldType.TIME
+                || fieldType == RecordFieldType.TIMESTAMP)) {
+            return RecordFieldType.STRING.getDataType();
+        } else {
+            return dataType;
+        }
+    }
+
+    private DataType getArrayDataType(final ResultSet rs, final int 
columnIndex, final boolean useLogicalTypes) throws SQLException {
+        // The JDBC API does not allow us to know what the base type of an 
array is through the metadata.
+        // As a result, we have to obtain the actual Array for this record. 
Once we have this, we can determine
+        // the base type. However, if the base type is, itself, an array, we 
will simply return a base type of
+        // String because otherwise, we need the ResultSet for the array 
itself, and many JDBC Drivers do not
+        // support calling Array.getResultSet() and will throw an Exception if 
that is not supported.
+        try {
+            final Array array = rs.getArray(columnIndex);
+
+            if (array == null) {
+                return 
RecordFieldType.ARRAY.getArrayDataType(RecordFieldType.STRING.getDataType());
+            }
+            final DataType baseType = getArrayBaseType(array, useLogicalTypes);
+            return RecordFieldType.ARRAY.getArrayDataType(baseType);
+        } catch (SQLFeatureNotSupportedException sfnse) {
+            return 
RecordFieldType.ARRAY.getArrayDataType(RecordFieldType.STRING.getDataType());
+        }
+    }
+
+    private DataType getDecimalDataType(final ResultSet rs, final int 
columnIndex) throws SQLException {
+        int decimalPrecision;
+        final int decimalScale;
+        final int resultSetPrecision = 
rs.getMetaData().getPrecision(columnIndex);
+        final int resultSetScale = rs.getMetaData().getScale(columnIndex);
+        if (rs.getMetaData().getPrecision(columnIndex) > 0) {

Review comment:
       Actually, I don't know. I just extracted this code to the 
`getDecimalDataType()` method to improve readability. I don't see any reason 
why we should not use `resultSetPrecision`, so I'll change that.




-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


Reply via email to