fix(iris): read vendor list values through JDBC objects

Closes #7551
This commit is contained in:
t8y2
2026-09-01 15:37:39 +00:00
parent 3325e97991
commit 51ca40e86e
2 changed files with 80 additions and 0 deletions
@@ -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<String> listSchemas() {
return dedupeCaseInsensitiveSchemas(StandardJdbcMetadata.INSTANCE.listSchemas(requireConnection(), IRIS_PROFILE));
@@ -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<String> 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<String> 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<String> 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<String> calls = new ArrayList<>();