Maksim Zhuravkov created IGNITE-24898:
-----------------------------------------
Summary: KeyValueView Mapper. No type mismatch when TypeConverter
is present
Key: IGNITE-24898
URL: https://issues.apache.org/jira/browse/IGNITE-24898
Project: Ignite
Issue Type: Improvement
Reporter: Maksim Zhuravkov
Reproducer (both thin client and embedded clients are affected).
{code:java}
// Table VARCHAR, Pojo bigift
public static class Kv {
private long val;
public long getVal() {
return val;
}
public void setVal(long val) {
this.val = val;
}
}
@Test
public void ddd() {
sql("CREATE TABLE t (k int, val varchar, primary key (k))");
sql("INSERT INTO t VALUES (1, 'abcd')");
TypeConverter<Object, Object> converter = new TypeConverter<>() {
@Override
public Object toColumnType(Object obj) throws Exception {
return obj;
}
@Override
public Object toObjectType(Object data) throws Exception {
return data;
}
};
Table table = client.tables().table("T");
Mapper<Kv> val = Mapper.builder(Kv.class).map("val", "val",
converter).build();
KeyValueView<Integer, Kv> v =
table.keyValueView(Mapper.of(Integer.class), val);
Kv kv = v.get(null, 1);
assertEquals(1684234849L, kv.val);
}
{code}
If we flip types (Table BIGINT, Pojo STRING) there is a class cast error:
{code:java}
public static class Kvs {
private String val;
public String getVal() {
return val;
}
public void setVal(String val) {
this.val = val;
}
}
@Test
public void ddd2() {
sql("CREATE TABLE t (k int, val bigint, primary key (k))");
sql("INSERT INTO t VALUES (1, 1684234849)");
TypeConverter<Object, Object> converter = new TypeConverter<>() {
@Override
public Object toColumnType(Object obj) throws Exception {
return obj;
}
@Override
public Object toObjectType(Object data) throws Exception {
return data;
}
};
Table table = CLUSTER.node(0).tables().table("T");
Mapper<Kvs> val = Mapper.builder(Kvs.class).map("val", "val",
converter).build();
KeyValueView<Integer, Kvs> v =
table.keyValueView(Mapper.of(Integer.class), val);
Kvs kv = v.get(null, 1);
assertEquals("abcd", kv.val);
}
{code}
Error:
{noformat}
Caused by: org.apache.ignite.lang.MarshallerException: IGN-MARSHALLING-1
TraceId:e688f43a-24ac-497b-b448-c4b8af1e9e1c java.lang.ClassCastException:
Cannot cast java.lang.Long to java.lang.String
at
org.apache.ignite.internal.marshaller.FieldAccessor.read(FieldAccessor.java:404)
at
org.apache.ignite.internal.marshaller.Marshaller$PojoMarshaller.readObject(Marshaller.java:284)
at
org.apache.ignite.internal.schema.marshaller.reflection.KvMarshallerImpl.unmarshalValue(KvMarshallerImpl.java:148)
at
org.apache.ignite.internal.table.KeyValueViewImpl.unmarshalNullableValue(KeyValueViewImpl.java:739)
at
org.apache.ignite.internal.table.KeyValueViewImpl.unmarshalValue(KeyValueViewImpl.java:782)
at
org.apache.ignite.internal.table.KeyValueViewImpl.lambda$doGet$1(KeyValueViewImpl.java:138)
at
java.base/java.util.concurrent.CompletableFuture.uniApplyNow(CompletableFuture.java:684)
at
java.base/java.util.concurrent.CompletableFuture.uniApplyStage(CompletableFuture.java:662)
at
java.base/java.util.concurrent.CompletableFuture.thenApply(CompletableFuture.java:2168)
at
org.apache.ignite.internal.table.KeyValueViewImpl.lambda$doGet$2(KeyValueViewImpl.java:138)
at
org.apache.ignite.internal.table.AbstractTableView.lambda$withSchemaSync$1(AbstractTableView.java:144)
at
java.base/java.util.concurrent.CompletableFuture.uniComposeStage(CompletableFuture.java:1187)
at
java.base/java.util.concurrent.CompletableFuture.thenCompose(CompletableFuture.java:2309)
at
org.apache.ignite.internal.table.AbstractTableView.withSchemaSync(AbstractTableView.java:144)
at
org.apache.ignite.internal.table.AbstractTableView.withSchemaSync(AbstractTableView.java:134)
at
org.apache.ignite.internal.table.AbstractTableView.doOperation(AbstractTableView.java:112)
at
org.apache.ignite.internal.table.KeyValueViewImpl.doGet(KeyValueViewImpl.java:135)
... 15 more
Caused by: java.lang.IllegalArgumentException: java.lang.ClassCastException:
Cannot cast java.lang.Long to java.lang.String
at
org.apache.ignite.internal.marshaller.FieldAccessor$ReferenceFieldAccessor.read0(FieldAccessor.java:799)
at
org.apache.ignite.internal.marshaller.FieldAccessor.read(FieldAccessor.java:402)
... 31 more
Caused by: java.lang.ClassCastException: Cannot cast java.lang.Long to
java.lang.String
at java.base/java.lang.Class.cast(Class.java:3889)
at
java.base/java.lang.invoke.VarHandleReferences$FieldInstanceReadWrite.set(VarHandleReferences.java:150)
at
org.apache.ignite.internal.marshaller.FieldAccessor$VarHandleAccessor.set(FieldAccessor.java:535)
at
org.apache.ignite.internal.marshaller.FieldAccessor$ReferenceFieldAccessor.read0(FieldAccessor.java:797)
{noformat}
--
This message was sent by Atlassian Jira
(v8.20.10#820010)