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

pvillard 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 7fb47fca87 NIFI-14929 Fixed Database Registry to ignore incompatible 
default values
7fb47fca87 is described below

commit 7fb47fca87423ea1396b032c6ef54feed14d14d6
Author: exceptionfactory <[email protected]>
AuthorDate: Thu Sep 4 22:10:58 2025 -0500

    NIFI-14929 Fixed Database Registry to ignore incompatible default values
    
    Signed-off-by: Pierre Villard <[email protected]>
    
    This closes #10276.
---
 .../DatabaseTableSchemaRegistry.java               | 22 ++++++++++++---
 .../DatabaseTableSchemaRegistryTest.java           | 32 +++++++++++++++++++++-
 2 files changed, 49 insertions(+), 5 deletions(-)

diff --git 
a/nifi-extension-bundles/nifi-standard-services/nifi-db-schema-registry-bundle/nifi-db-schema-registry-service/src/main/java/org/apache/nifi/db/schemaregistry/DatabaseTableSchemaRegistry.java
 
b/nifi-extension-bundles/nifi-standard-services/nifi-db-schema-registry-bundle/nifi-db-schema-registry-service/src/main/java/org/apache/nifi/db/schemaregistry/DatabaseTableSchemaRegistry.java
index c93039cd31..38a90a3a06 100644
--- 
a/nifi-extension-bundles/nifi-standard-services/nifi-db-schema-registry-bundle/nifi-db-schema-registry-service/src/main/java/org/apache/nifi/db/schemaregistry/DatabaseTableSchemaRegistry.java
+++ 
b/nifi-extension-bundles/nifi-standard-services/nifi-db-schema-registry-bundle/nifi-db-schema-registry-service/src/main/java/org/apache/nifi/db/schemaregistry/DatabaseTableSchemaRegistry.java
@@ -29,6 +29,7 @@ import org.apache.nifi.schema.access.SchemaField;
 import org.apache.nifi.schema.access.SchemaNotFoundException;
 import org.apache.nifi.schemaregistry.services.SchemaRegistry;
 import org.apache.nifi.serialization.SimpleRecordSchema;
+import org.apache.nifi.serialization.record.DataType;
 import org.apache.nifi.serialization.record.RecordField;
 import org.apache.nifi.serialization.record.RecordSchema;
 import org.apache.nifi.serialization.record.SchemaIdentifier;
@@ -137,7 +138,7 @@ public class DatabaseTableSchemaRegistry extends 
AbstractControllerService imple
 
             final List<RecordField> recordFields = new ArrayList<>();
             while (columnResultSet.next()) {
-                recordFields.add(createRecordFieldFromColumn(columnResultSet));
+                recordFields.add(createRecordFieldFromColumn(columnResultSet, 
tableName));
             }
 
             // If no columns are found, check that the table exists
@@ -148,7 +149,7 @@ public class DatabaseTableSchemaRegistry extends 
AbstractControllerService imple
         }
     }
 
-    private RecordField createRecordFieldFromColumn(final ResultSet 
columnResultSet) throws SQLException {
+    private RecordField createRecordFieldFromColumn(final ResultSet 
columnResultSet, final String tableName) throws SQLException {
         // COLUMN_DEF must be read first to work around Oracle bug, see 
NIFI-4279 for details
         final String defaultValue = columnResultSet.getString("COLUMN_DEF");
         final String columnName = columnResultSet.getString("COLUMN_NAME");
@@ -159,12 +160,25 @@ public class DatabaseTableSchemaRegistry extends 
AbstractControllerService imple
         } else {
             dataType = columnResultSet.getInt("DATA_TYPE");
         }
+        final DataType fieldDataType = 
DataTypeUtils.getDataTypeFromSQLTypeValue(dataType);
         final String nullableValue = columnResultSet.getString("IS_NULLABLE");
         final boolean isNullable = "YES".equalsIgnoreCase(nullableValue) || 
nullableValue.isEmpty();
+
+        final String fieldDefaultValue;
+
+        if (defaultValue == null) {
+            fieldDefaultValue = null;
+        } else if (DataTypeUtils.isCompatibleDataType(defaultValue, 
fieldDataType)) {
+            fieldDefaultValue = defaultValue;
+        } else {
+            getLogger().info("Table [{}] Column [{}] Default Value [{}] not 
compatible with Data Type [{}]", tableName, columnName, defaultValue, 
fieldDataType);
+            fieldDefaultValue = null;
+        }
+
         return new RecordField(
                 columnName,
-                DataTypeUtils.getDataTypeFromSQLTypeValue(dataType),
-                defaultValue,
+                fieldDataType,
+                fieldDefaultValue,
                 isNullable);
     }
 
diff --git 
a/nifi-extension-bundles/nifi-standard-services/nifi-db-schema-registry-bundle/nifi-db-schema-registry-service/src/test/java/org/apache/nifi/db/schemaregistry/DatabaseTableSchemaRegistryTest.java
 
b/nifi-extension-bundles/nifi-standard-services/nifi-db-schema-registry-bundle/nifi-db-schema-registry-service/src/test/java/org/apache/nifi/db/schemaregistry/DatabaseTableSchemaRegistryTest.java
index 51b8faa214..bb6e6ea011 100644
--- 
a/nifi-extension-bundles/nifi-standard-services/nifi-db-schema-registry-bundle/nifi-db-schema-registry-service/src/test/java/org/apache/nifi/db/schemaregistry/DatabaseTableSchemaRegistryTest.java
+++ 
b/nifi-extension-bundles/nifi-standard-services/nifi-db-schema-registry-bundle/nifi-db-schema-registry-service/src/test/java/org/apache/nifi/db/schemaregistry/DatabaseTableSchemaRegistryTest.java
@@ -52,6 +52,7 @@ import java.util.Optional;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertFalse;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNull;
 import static org.junit.jupiter.api.Assertions.assertThrows;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.mockito.Mockito.spy;
@@ -66,7 +67,8 @@ public class DatabaseTableSchemaRegistryTest {
             "CREATE TABLE SCHEMA2.PERSONS (id2 integer primary key, name 
varchar(100)," +
                     " code integer CONSTRAINT CODE_RANGE CHECK (code >= 0 AND 
code < 1000), dt date)",
             "CREATE TABLE UUID_TEST (id integer primary key, name 
VARCHAR(100))",
-            "CREATE TABLE LONGVARBINARY_TEST (id integer primary key, name 
LONG VARCHAR FOR BIT DATA)"
+            "CREATE TABLE LONGVARBINARY_TEST (id integer primary key, name 
LONG VARCHAR FOR BIT DATA)",
+            "CREATE TABLE CONSTANTS (id integer primary key, created TIMESTAMP 
DEFAULT CURRENT_TIMESTAMP)"
     );
 
     private static final String SERVICE_ID = SimpleDBCPService.class.getName();
@@ -197,6 +199,34 @@ public class DatabaseTableSchemaRegistryTest {
         assertThrows(SchemaNotFoundException.class, () -> 
dbSchemaRegistry.retrieveSchema(schemaIdentifier));
     }
 
+    @Test
+    public void testGetSchemaCurrentTimestampIgnored() throws Exception {
+        final DatabaseTableSchemaRegistry dbSchemaRegistry = new 
DatabaseTableSchemaRegistry();
+        runner.addControllerService("schemaRegistry", dbSchemaRegistry);
+
+        runner.setProperty(dbSchemaRegistry, 
DatabaseTableSchemaRegistry.DBCP_SERVICE, SERVICE_ID);
+
+        runner.enableControllerService(dbSchemaRegistry);
+
+        final SchemaIdentifier schemaIdentifier = new 
StandardSchemaIdentifier.Builder()
+                .name("CONSTANTS")
+                .build();
+        final RecordSchema recordSchema = 
dbSchemaRegistry.retrieveSchema(schemaIdentifier);
+        assertNotNull(recordSchema);
+
+        final Optional<RecordField> idField = recordSchema.getField("ID");
+        assertTrue(idField.isPresent());
+        assertEquals(RecordFieldType.INT.getDataType(), 
idField.get().getDataType());
+
+        final Optional<RecordField> createdFieldFound = 
recordSchema.getField("CREATED");
+        assertTrue(createdFieldFound.isPresent());
+        final RecordField createdField = createdFieldFound.get();
+        assertEquals(RecordFieldType.TIMESTAMP.getDataType(), 
createdField.getDataType());
+
+        // Default Value of CURRENT_TIMESTAMP ignored
+        assertNull(createdField.getDefaultValue());
+    }
+
     private static class SimpleDBCPService extends AbstractControllerService 
implements DBCPService {
 
         private final String databaseLocation;

Reply via email to