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

pvillard31 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 c9c68cf69e7 NIFI-16080 Switch to JDBC Enquote Identifier in 
UpdateDatabaseTable (#11397)
c9c68cf69e7 is described below

commit c9c68cf69e7e186359c8ca2aa4695c7828c51915
Author: David Handermann <[email protected]>
AuthorDate: Tue Jul 7 03:34:48 2026 -0500

    NIFI-16080 Switch to JDBC Enquote Identifier in UpdateDatabaseTable (#11397)
---
 .../processors/standard/UpdateDatabaseTable.java   | 46 +++++++++++++---------
 .../standard/TestUpdateDatabaseTable.java          | 30 +++++++++++++-
 2 files changed, 55 insertions(+), 21 deletions(-)

diff --git 
a/nifi-extension-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/UpdateDatabaseTable.java
 
b/nifi-extension-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/UpdateDatabaseTable.java
index 049009f8348..5b79c374dae 100644
--- 
a/nifi-extension-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/UpdateDatabaseTable.java
+++ 
b/nifi-extension-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/UpdateDatabaseTable.java
@@ -537,14 +537,14 @@ public class UpdateDatabaseTable extends 
AbstractProcessor {
                         }
 
                         final int dataType = 
DataTypeUtils.getSQLTypeValue(recordField.getDataType());
-                        final String quotedColumnName = 
enquoteIdentifier(columnName, quoteString, quoteColumnNames);
+                        final String quotedColumnName = enquoteIdentifier(s, 
columnName, quoteColumnNames);
                         columns.add(new ColumnDescription(quotedColumnName, 
dataType, required, null, recordField.isNullable()));
                         getLogger().debug("Adding column {} to table {}", 
columnName, tableName);
                     }
 
-                    final String quotedCatalogName = 
enquoteIdentifier(catalogName, quoteString, quoteTableName);
-                    final String quotedSchemaName = 
enquoteIdentifier(schemaName, quoteString, quoteTableName);
-                    final String quotedTableName = 
enquoteIdentifier(tableName, quoteString, quoteTableName);
+                    final String quotedCatalogName = enquoteIdentifier(s, 
catalogName, quoteTableName);
+                    final String quotedSchemaName = enquoteIdentifier(s, 
schemaName, quoteTableName);
+                    final String quotedTableName = enquoteIdentifier(s, 
tableName, quoteTableName);
                     tableSchema = new TableSchema(quotedCatalogName, 
quotedSchemaName, quotedTableName, columns, translateFieldNames, normalizer, 
primaryKeyColumnNames, quoteString);
 
                     final TableDefinition tableDefinition = 
getTableDefinition(tableSchema);
@@ -588,17 +588,18 @@ public class UpdateDatabaseTable extends 
AbstractProcessor {
                 }
 
                 if (!columnsToAdd.isEmpty()) {
-                    final List<ColumnDefinition> columnDefinitions = 
columnsToAdd.stream().map(columnDescription ->
-                            new StandardColumnDefinition(
-                                    
enquoteIdentifier(columnDescription.getColumnName(), quoteString, 
quoteColumnNames),
-                                    columnDescription.getDataType(),
-                                    columnDescription.isNullable() ? 
ColumnDefinition.Nullable.YES : ColumnDefinition.Nullable.UNKNOWN,
-                                    columnDescription.isRequired()
-                            )
-                            )
-                            .map(ColumnDefinition.class::cast)
-                            .toList();
-                    final String qualifiedTableName = 
enquoteIdentifier(tableName, quoteString, quoteTableName);
+                    final List<ColumnDefinition> columnDefinitions = new 
ArrayList<>(columnsToAdd.size());
+                    for (final ColumnDescription columnDescription : 
columnsToAdd) {
+                        final ColumnDefinition columnDefinition = new 
StandardColumnDefinition(
+                                enquoteIdentifier(s, 
columnDescription.getColumnName(), quoteColumnNames),
+                                columnDescription.getDataType(),
+                                columnDescription.isNullable() ? 
ColumnDefinition.Nullable.YES : ColumnDefinition.Nullable.UNKNOWN,
+                                columnDescription.isRequired()
+                        );
+                        columnDefinitions.add(columnDefinition);
+                    }
+
+                    final String qualifiedTableName = enquoteIdentifier(s, 
tableName, quoteTableName);
                     final TableDefinition tableDefinition = new 
TableDefinition(Optional.empty(), Optional.empty(), qualifiedTableName, 
columnDefinitions);
                     final StatementRequest statementRequest = new 
StandardStatementRequest(StatementType.ALTER, tableDefinition);
                     final StatementResponse statementResponse = 
databaseDialectService.getStatement(statementRequest);
@@ -708,11 +709,18 @@ public class UpdateDatabaseTable extends 
AbstractProcessor {
         );
     }
 
-    private String enquoteIdentifier(final String identifier, final String 
quotedIdentifierString, final boolean quoteIdentifier) {
-        if (identifier != null && quoteIdentifier) {
-            return quotedIdentifierString + identifier + 
quotedIdentifierString;
+    private String enquoteIdentifier(final Statement statement, final String 
identifier, final boolean quoteIdentifier) throws SQLException {
+        final String enquoted;
+
+        if (identifier == null) {
+            enquoted = identifier;
+        } else if (quoteIdentifier) {
+            enquoted = statement.enquoteIdentifier(identifier, 
quoteIdentifier);
+        } else {
+            enquoted = identifier;
         }
-        return identifier;
+
+        return enquoted;
     }
 
     private static class OutputMetadataHolder {
diff --git 
a/nifi-extension-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/TestUpdateDatabaseTable.java
 
b/nifi-extension-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/TestUpdateDatabaseTable.java
index 2b472e065b2..d2dd468616d 100644
--- 
a/nifi-extension-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/TestUpdateDatabaseTable.java
+++ 
b/nifi-extension-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/TestUpdateDatabaseTable.java
@@ -83,6 +83,32 @@ class TestUpdateDatabaseTable extends 
AbstractDatabaseConnectionServiceTest {
         }
     }
 
+    @Test
+    void testCreateTableIdentifierLengthExceeded() throws 
InitializationException {
+        final MockRecordParser recordReader = new MockRecordParser();
+        final String recordReaderId = MockRecordParser.class.getSimpleName();
+
+        // Column Name longer than 128 produces SQLException in default 
implementation of Statement.enquoteIdentifier()
+        final String columnName = "A".repeat(129);
+
+        recordReader.addSchemaField(new RecordField(columnName, 
RecordFieldType.INT.getDataType(), false));
+        recordReader.addRecord(1);
+
+        runner.addControllerService(recordReaderId, recordReader);
+        runner.enableControllerService(recordReader);
+
+        runner.setProperty(UpdateDatabaseTable.RECORD_READER, recordReaderId);
+        runner.setProperty(UpdateDatabaseTable.TABLE_NAME, "NEW_TABLE");
+        runner.setProperty(UpdateDatabaseTable.CREATE_TABLE, 
UpdateDatabaseTable.CREATE_IF_NOT_EXISTS);
+        runner.setProperty(UpdateDatabaseTable.QUOTE_COLUMN_IDENTIFIERS, 
Boolean.TRUE.toString());
+        runner.setProperty(UpdateDatabaseTable.DB_TYPE, TEST_DB_TYPE);
+
+        runner.enqueue(new byte[0]);
+        runner.run();
+
+        runner.assertAllFlowFilesTransferred(UpdateDatabaseTable.REL_FAILURE);
+    }
+
     @Test
     public void testCreateTable() throws Exception {
         MockRecordParser readerFactory = new MockRecordParser();
@@ -90,7 +116,7 @@ class TestUpdateDatabaseTable extends 
AbstractDatabaseConnectionServiceTest {
         readerFactory.addSchemaField(new RecordField("id", 
RecordFieldType.INT.getDataType(), false));
         readerFactory.addSchemaField(new RecordField("fractional", 
RecordFieldType.DOUBLE.getDataType(), true));
         readerFactory.addSchemaField(new RecordField("code", 
RecordFieldType.INT.getDataType(), 0, true));
-        readerFactory.addSchemaField(new RecordField("newField", 
RecordFieldType.DOUBLE.getDataType(), false));
+        readerFactory.addSchemaField(new RecordField("spaced Field", 
RecordFieldType.DOUBLE.getDataType(), false));
         readerFactory.addRecord(1, 1.2345, 10);
 
         runner.addControllerService("mock-reader-factory", readerFactory);
@@ -120,7 +146,7 @@ class TestUpdateDatabaseTable extends 
AbstractDatabaseConnectionServiceTest {
             assertColumnEquals(rs, "id", 1, "INTEGER");
             assertColumnEquals(rs, "fractional", 2, "DOUBLE PRECISION");
             assertColumnEquals(rs, "code", 3, "INTEGER");
-            assertColumnEquals(rs, "newField", 4, "DOUBLE PRECISION");
+            assertColumnEquals(rs, "spaced Field", 4, "DOUBLE PRECISION");
             assertFalse(rs.next());
         }
     }

Reply via email to