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

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


The following commit(s) were added to refs/heads/main by this push:
     new 80312ae30d Keep Database Lookup length and precision when a return 
Type is set (#8267)
80312ae30d is described below

commit 80312ae30dfc91d848aeaa5a7c6bad4cb9705702
Author: Lance <[email protected]>
AuthorDate: Sat Sep 5 17:23:58 2026 +0800

    Keep Database Lookup length and precision when a return Type is set (#8267)
    
    Signed-off-by: lance <[email protected]>
---
 .../databaselookup/DatabaseLookupMeta.java         | 32 +++++++++--
 .../databaselookup/DatabaseLookupMetaTest.java     | 65 +++++++++++++++++++++-
 2 files changed, 91 insertions(+), 6 deletions(-)

diff --git 
a/plugins/transforms/databaselookup/src/main/java/org/apache/hop/pipeline/transforms/databaselookup/DatabaseLookupMeta.java
 
b/plugins/transforms/databaselookup/src/main/java/org/apache/hop/pipeline/transforms/databaselookup/DatabaseLookupMeta.java
index e6305af5ad..f4867b5275 100644
--- 
a/plugins/transforms/databaselookup/src/main/java/org/apache/hop/pipeline/transforms/databaselookup/DatabaseLookupMeta.java
+++ 
b/plugins/transforms/databaselookup/src/main/java/org/apache/hop/pipeline/transforms/databaselookup/DatabaseLookupMeta.java
@@ -119,6 +119,8 @@ public class DatabaseLookupMeta extends 
BaseTransformMeta<DatabaseLookup, Databa
     try {
       // Prefer an explicit return type. When none is configured, infer from 
table field
       // metadata (info row from design-time / runtime, otherwise query the 
table).
+      // When a type is set, still clone the table field so length, precision, 
conversion
+      // mask and original JDBC metadata are kept (issue #8260).
       //
       IRowMeta tableFields = null;
       if (!Utils.isEmpty(infoRowMeta) && infoRowMeta[0] != null) {
@@ -131,19 +133,35 @@ public class DatabaseLookupMeta extends 
BaseTransformMeta<DatabaseLookup, Databa
                 ? returnValue.getNewName()
                 : returnValue.getTableField();
         int typeId = 
ValueMetaFactory.getIdForValueMeta(returnValue.getDefaultType());
+        IValueMeta source = tableField(tableFields, 
returnValue.getTableField());
+        if (source == null && tableFields == null) {
+          try {
+            tableFields = getTableFields(variables);
+          } catch (Exception e) {
+            if (typeId == IValueMeta.TYPE_NONE) {
+              if (e instanceof HopException hopException) {
+                throw hopException;
+              }
+              throw new HopException(e);
+            }
+          }
+          source = tableField(tableFields, returnValue.getTableField());
+        }
+
         IValueMeta v;
         if (typeId != IValueMeta.TYPE_NONE) {
-          v = ValueMetaFactory.createValueMeta(fieldName, typeId);
-        } else {
-          if (tableFields == null) {
-            tableFields = getTableFields(variables);
+          if (source != null) {
+            v = ValueMetaFactory.cloneValueMeta(source, typeId);
+            v.setName(fieldName);
+          } else {
+            v = ValueMetaFactory.createValueMeta(fieldName, typeId);
           }
+        } else {
           if (tableFields == null) {
             throw new HopTransformException(
                 BaseMessages.getString(
                     PKG, 
"DatabaseLookupMeta.Exception.UnableToRetrieveDataTypeOfReturnField"));
           }
-          IValueMeta source = 
tableFields.searchValueMeta(returnValue.getTableField());
           if (source == null) {
             throw new HopTransformException(
                 BaseMessages.getString(
@@ -361,6 +379,10 @@ public class DatabaseLookupMeta extends 
BaseTransformMeta<DatabaseLookup, Databa
     }
   }
 
+  private static IValueMeta tableField(IRowMeta tableFields, String name) {
+    return tableFields == null ? null : tableFields.searchValueMeta(name);
+  }
+
   @Override
   public IRowMeta getTableFields(IVariables variables) throws 
HopDatabaseException {
     IRowMeta fields = null;
diff --git 
a/plugins/transforms/databaselookup/src/test/java/org/apache/hop/pipeline/transforms/databaselookup/DatabaseLookupMetaTest.java
 
b/plugins/transforms/databaselookup/src/test/java/org/apache/hop/pipeline/transforms/databaselookup/DatabaseLookupMetaTest.java
index 257f2a6ca6..8f847efa84 100644
--- 
a/plugins/transforms/databaselookup/src/test/java/org/apache/hop/pipeline/transforms/databaselookup/DatabaseLookupMetaTest.java
+++ 
b/plugins/transforms/databaselookup/src/test/java/org/apache/hop/pipeline/transforms/databaselookup/DatabaseLookupMetaTest.java
@@ -200,7 +200,7 @@ class DatabaseLookupMetaTest {
 
     IRowMeta[] info = new IRowMeta[1];
     info[0] = new RowMeta();
-    info[0].addValueMeta(new ValueMetaInteger("amount"));
+    info[0].addValueMeta(new ValueMetaInteger("amount", 9, 0));
 
     IRowMeta row = new RowMeta();
     databaseLookupMeta.getFields(row, "Database lookup", info, null, null, 
null);
@@ -209,6 +209,69 @@ class DatabaseLookupMetaTest {
     IValueMeta amount = row.searchValueMeta("amount");
     assertNotNull(amount);
     assertEquals(IValueMeta.TYPE_STRING, amount.getType());
+    assertEquals(9, amount.getLength());
+    // String fields always report precision -1 (ValueMetaBase.getPrecision)
+    assertEquals(-1, amount.getPrecision());
+  }
+
+  @Test
+  void getFieldsKeepsLengthWhenConfiguredTypeMatchesTable() throws Exception {
+    Lookup lookup = databaseLookupMeta.getLookup();
+    lookup
+        .getReturnValues()
+        .add(
+            new ReturnValue(
+                "description",
+                "",
+                "",
+                "String",
+                ValueMetaString.getTrimTypeCode(IValueMeta.TRIM_TYPE_NONE)));
+
+    ValueMetaString tableField = new ValueMetaString("description", 30, -1);
+    tableField.setComments("dictionary_value");
+    tableField.setConversionMask("#");
+
+    IRowMeta[] info = new IRowMeta[1];
+    info[0] = new RowMeta();
+    info[0].addValueMeta(tableField);
+
+    IRowMeta row = new RowMeta();
+    databaseLookupMeta.getFields(row, "lookup type set", info, null, null, 
null);
+
+    IValueMeta description = row.searchValueMeta("description");
+    assertNotNull(description);
+    assertEquals(IValueMeta.TYPE_STRING, description.getType());
+    assertEquals(30, description.getLength());
+    assertEquals(-1, description.getPrecision());
+    assertEquals("#", description.getConversionMask());
+    assertEquals("dictionary_value", description.getComments());
+    assertEquals("lookup type set", description.getOrigin());
+  }
+
+  @Test
+  void getFieldsStillCreatesTypeWhenTableFieldIsMissing() throws Exception {
+    Lookup lookup = databaseLookupMeta.getLookup();
+    lookup
+        .getReturnValues()
+        .add(
+            new ReturnValue(
+                "description",
+                "",
+                "",
+                "String",
+                ValueMetaString.getTrimTypeCode(IValueMeta.TRIM_TYPE_NONE)));
+
+    IRowMeta[] info = new IRowMeta[1];
+    info[0] = new RowMeta();
+    info[0].addValueMeta(new ValueMetaString("other"));
+
+    IRowMeta row = new RowMeta();
+    databaseLookupMeta.getFields(row, "Database lookup", info, null, null, 
null);
+
+    IValueMeta description = row.searchValueMeta("description");
+    assertNotNull(description);
+    assertEquals(IValueMeta.TYPE_STRING, description.getType());
+    assertEquals(-1, description.getLength());
   }
 
   @Test

Reply via email to