You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nifi.apache.org by tu...@apache.org on 2022/11/24 15:58:26 UTC

[nifi] branch main updated: NIFI-5819: Support SQLServer sql_variant type

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

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


The following commit(s) were added to refs/heads/main by this push:
     new 5f1d93f977 NIFI-5819: Support SQLServer sql_variant type
5f1d93f977 is described below

commit 5f1d93f977b3702b63c72d7e07af7dc820a2fc70
Author: Matthew Burgess <ma...@apache.org>
AuthorDate: Mon Nov 21 18:35:35 2022 -0500

    NIFI-5819: Support SQLServer sql_variant type
    
    This closes #6699.
    
    Signed-off-by: Peter Turcsanyi <tu...@apache.org>
---
 .../src/main/java/org/apache/nifi/util/db/JdbcCommon.java         | 5 +++++
 .../org/apache/nifi/processors/standard/PutDatabaseRecord.java    | 8 ++++++++
 2 files changed, 13 insertions(+)

diff --git a/nifi-nar-bundles/nifi-extension-utils/nifi-database-utils/src/main/java/org/apache/nifi/util/db/JdbcCommon.java b/nifi-nar-bundles/nifi-extension-utils/nifi-database-utils/src/main/java/org/apache/nifi/util/db/JdbcCommon.java
index b78408c912..ad7471a54c 100644
--- a/nifi-nar-bundles/nifi-extension-utils/nifi-database-utils/src/main/java/org/apache/nifi/util/db/JdbcCommon.java
+++ b/nifi-nar-bundles/nifi-extension-utils/nifi-database-utils/src/main/java/org/apache/nifi/util/db/JdbcCommon.java
@@ -650,6 +650,11 @@ public class JdbcCommon {
                     builder.name(columnName).type().unionOf().nullBuilder().endNull().and().bytesType().endUnion().noDefault();
                     break;
 
+                case -150: // SQLServer may return -150 from the driver even though it's really -156 (sql_variant), treat as a union since we don't know what the values will actually be
+                case -156:
+                    builder.name(columnName).type().unionOf().nullBuilder().endNull().and().stringType().and().intType().and().longType().and().booleanType().and().bytesType().and()
+                            .doubleType().and().floatType().endUnion().noDefault();
+                    break;
 
                 default:
                     throw new IllegalArgumentException("createSchema: Unknown SQL type " + meta.getColumnType(i) + " / " + meta.getColumnTypeName(i)
diff --git a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/PutDatabaseRecord.java b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/PutDatabaseRecord.java
index 5e94200b44..3a1c8ca56e 100644
--- a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/PutDatabaseRecord.java
+++ b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/PutDatabaseRecord.java
@@ -736,12 +736,20 @@ public class PutDatabaseRecord extends AbstractProcessor {
                             }
                         } else {
                             sqlType = column.getDataType();
+                            // SQLServer returns -150 for sql_variant from DatabaseMetaData though the server expects -156 when setting a sql_variant parameter
+                            if (sqlType == -150) {
+                                sqlType = -156;
+                            }
                         }
 
                         // Convert (if necessary) from field data type to column data type
                         if (fieldSqlType != sqlType) {
                             try {
                                 DataType targetDataType = DataTypeUtils.getDataTypeFromSQLTypeValue(sqlType);
+                                // If sqlType is unsupported, fall back to the fieldSqlType instead
+                                if (targetDataType == null) {
+                                    targetDataType = DataTypeUtils.getDataTypeFromSQLTypeValue(fieldSqlType);
+                                }
                                 if (targetDataType != null) {
                                     if (sqlType == Types.BLOB || sqlType == Types.BINARY) {
                                         if (currentValue instanceof Object[]) {