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;