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