From 51ca40e86ebdaec204e3968e3b220d97219649f3 Mon Sep 17 00:00:00 2001 From: t8y2 <1156263951@qq.com> Date: Tue, 1 Sep 2026 15:36:37 +0000 Subject: [PATCH] fix(iris): read vendor list values through JDBC objects Closes #7551 --- .../java/com/dbx/agent/iris/IrisAgent.java | 10 +++ .../com/dbx/agent/iris/IrisAgentTest.java | 70 +++++++++++++++++++ 2 files changed, 80 insertions(+) diff --git a/agents/drivers/iris/src/main/java/com/dbx/agent/iris/IrisAgent.java b/agents/drivers/iris/src/main/java/com/dbx/agent/iris/IrisAgent.java index 3414bcaa30..81c5016816 100644 --- a/agents/drivers/iris/src/main/java/com/dbx/agent/iris/IrisAgent.java +++ b/agents/drivers/iris/src/main/java/com/dbx/agent/iris/IrisAgent.java @@ -3,6 +3,7 @@ package com.dbx.agent.iris; import com.dbx.agent.ConfiguredJdbcAgent; import com.dbx.agent.ColumnInfo; import com.dbx.agent.JdbcAgentProfile; +import com.dbx.agent.JdbcExecutor; import com.dbx.agent.MultiSessionJsonRpcServer; import com.dbx.agent.StandardJdbcMetadata; @@ -10,6 +11,7 @@ import java.sql.Connection; import java.sql.DatabaseMetaData; import java.sql.PreparedStatement; import java.sql.ResultSet; +import java.sql.Types; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.LinkedHashSet; @@ -30,6 +32,14 @@ public final class IrisAgent extends ConfiguredJdbcAgent { super(IRIS_PROFILE); } + @Override + protected Object resultValue(ResultSet rs, int index, int sqlType) { + if (sqlType == Types.OTHER) { + return unchecked(() -> JdbcExecutor.normalizeResultValue(rs.getObject(index))); + } + return super.resultValue(rs, index, sqlType); + } + @Override public List listSchemas() { return dedupeCaseInsensitiveSchemas(StandardJdbcMetadata.INSTANCE.listSchemas(requireConnection(), IRIS_PROFILE)); diff --git a/agents/drivers/iris/src/test/java/com/dbx/agent/iris/IrisAgentTest.java b/agents/drivers/iris/src/test/java/com/dbx/agent/iris/IrisAgentTest.java index 81186aae74..9114eb6204 100644 --- a/agents/drivers/iris/src/test/java/com/dbx/agent/iris/IrisAgentTest.java +++ b/agents/drivers/iris/src/test/java/com/dbx/agent/iris/IrisAgentTest.java @@ -11,6 +11,7 @@ import java.sql.DatabaseMetaData; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; +import java.sql.Types; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; @@ -46,6 +47,75 @@ class IrisAgentTest { ); } + @Test + void readsVendorOtherValuesThroughGetObject() { + List calls = new ArrayList<>(); + ResultSet resultSet = proxy(ResultSet.class, (method, args) -> { + if ("getObject".equals(method.getName())) { + calls.add("getObject"); + return new Object() { + @Override + public String toString() { + return "%List(1,2)"; + } + }; + } + if ("getString".equals(method.getName())) { + calls.add("getString"); + throw new AssertionError("IRIS %LIST must not use getString"); + } + if ("wasNull".equals(method.getName())) { + return false; + } + return defaultValue(method.getReturnType()); + }); + + Object value = new IrisAgent().resultValue(resultSet, 1, Types.OTHER); + + assertEquals("%List(1,2)", value); + assertEquals(Collections.singletonList("getObject"), calls); + } + + @Test + void preservesStringPathForStandardValues() { + List calls = new ArrayList<>(); + ResultSet resultSet = proxy(ResultSet.class, (method, args) -> { + if ("getString".equals(method.getName())) { + calls.add("getString"); + return "ordinary"; + } + if ("wasNull".equals(method.getName())) { + return false; + } + return defaultValue(method.getReturnType()); + }); + + Object value = new IrisAgent().resultValue(resultSet, 1, Types.VARCHAR); + + assertEquals("ordinary", value); + assertEquals(Collections.singletonList("getString"), calls); + } + + @Test + void preservesNullForVendorOtherValues() { + List calls = new ArrayList<>(); + ResultSet resultSet = proxy(ResultSet.class, (method, args) -> { + if ("getObject".equals(method.getName())) { + calls.add("getObject"); + return null; + } + if ("wasNull".equals(method.getName())) { + return true; + } + return defaultValue(method.getReturnType()); + }); + + Object value = new IrisAgent().resultValue(resultSet, 1, Types.OTHER); + + assertNull(value); + assertEquals(Collections.singletonList("getObject"), calls); + } + @Test void readsColumnsAndUsesInlinePrimaryKey() { List calls = new ArrayList<>();