Skip to content

Codec error #76

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
andreamatt opened this issue Feb 6, 2025 · 7 comments
Closed

Codec error #76

andreamatt opened this issue Feb 6, 2025 · 7 comments
Labels
bug Something isn't working

Comments

@andreamatt
Copy link

Using this schema

CREATE TYPE scraper.prices_preview_data (
    start_day smallint,
    nr_adults smallint,
    price blob,
    los blob,
    min_los blob,
    scraped_status blob
);

CREATE TABLE scraper.prices_preview (
    hotel_id bigint,
    year smallint,
    updated_at timestamp,
    currency tinyint,
    data frozen<list<frozen<prices_preview_data>>>,
    PRIMARY KEY ((hotel_id, year), updated_at)
) WITH CLUSTERING ORDER BY (updated_at DESC)

I get this
Image

So, both the simple tinyint and the UDT are not working.

Tinyint:

	at com.datastax.oss.driver.internal.core.type.codec.registry.CachingCodecRegistry.createCodec(CachingCodecRegistry.java:667)
	at com.datastax.oss.driver.internal.core.type.codec.registry.DefaultCodecRegistry$1.load(DefaultCodecRegistry.java:97)
	at com.datastax.oss.driver.internal.core.type.codec.registry.DefaultCodecRegistry$1.load(DefaultCodecRegistry.java:94)
	at com.datastax.oss.driver.shaded.guava.common.cache.LocalCache$LoadingValueReference.loadFuture(LocalCache.java:3527)
	at com.datastax.oss.driver.shaded.guava.common.cache.LocalCache$Segment.loadSync(LocalCache.java:2276)
	at com.datastax.oss.driver.shaded.guava.common.cache.LocalCache$Segment.lockedGetOrLoad(LocalCache.java:2154)
	at com.datastax.oss.driver.shaded.guava.common.cache.LocalCache$Segment.get(LocalCache.java:2044)
	at com.datastax.oss.driver.shaded.guava.common.cache.LocalCache.get(LocalCache.java:3951)
	at com.datastax.oss.driver.shaded.guava.common.cache.LocalCache.getOrLoad(LocalCache.java:3973)
	at com.datastax.oss.driver.shaded.guava.common.cache.LocalCache$LocalLoadingCache.get(LocalCache.java:4957)
	at com.datastax.oss.driver.shaded.guava.common.cache.LocalCache$LocalLoadingCache.getUnchecked(LocalCache.java:4963)
	at com.datastax.oss.driver.internal.core.type.codec.registry.DefaultCodecRegistry.getCachedCodec(DefaultCodecRegistry.java:119)
	at com.datastax.oss.driver.internal.core.type.codec.registry.CachingCodecRegistry.codecFor(CachingCodecRegistry.java:220)
	at com.datastax.oss.driver.api.core.data.GettableByIndex.getShort(GettableByIndex.java:312)
	at com.ing.data.cassandra.jdbc.CassandraResultSet.getShort(CassandraResultSet.java:1352)
	at org.jkiss.dbeaver.model.impl.jdbc.exec.JDBCResultSetImpl.getShort(JDBCResultSetImpl.java:372)
	at org.jkiss.dbeaver.model.impl.jdbc.data.handlers.JDBCNumberValueHandler.fetchColumnValue(JDBCNumberValueHandler.java:130)
	at org.jkiss.dbeaver.model.impl.jdbc.data.handlers.JDBCAbstractValueHandler.fetchValueObject(JDBCAbstractValueHandler.java:49)
	at org.jkiss.dbeaver.ui.controls.resultset.ResultSetDataReceiver.fetchRow(ResultSetDataReceiver.java:126)
	at org.jkiss.dbeaver.ui.editors.sql.execute.SQLQueryJob.fetchQueryData(SQLQueryJob.java:916)
	at org.jkiss.dbeaver.ui.editors.sql.execute.SQLQueryJob.executeStatement(SQLQueryJob.java:682)
	at org.jkiss.dbeaver.ui.editors.sql.execute.SQLQueryJob.lambda$2(SQLQueryJob.java:522)
	at org.jkiss.dbeaver.model.exec.DBExecUtils.tryExecuteRecover(DBExecUtils.java:192)
	at org.jkiss.dbeaver.ui.editors.sql.execute.SQLQueryJob.executeSingleQuery(SQLQueryJob.java:541)
	at org.jkiss.dbeaver.ui.editors.sql.execute.SQLQueryJob.extractData(SQLQueryJob.java:1016)
	at org.jkiss.dbeaver.ui.editors.sql.SQLEditor$QueryResultsContainer.readData(SQLEditor.java:4273)
	at org.jkiss.dbeaver.ui.controls.resultset.ResultSetJobDataRead.lambda$0(ResultSetJobDataRead.java:128)
	at org.jkiss.dbeaver.model.exec.DBExecUtils.tryExecuteRecover(DBExecUtils.java:192)
	at org.jkiss.dbeaver.ui.controls.resultset.ResultSetJobDataRead.run(ResultSetJobDataRead.java:126)
	at org.jkiss.dbeaver.ui.controls.resultset.ResultSetViewer$ResultSetDataPumpJob.run(ResultSetViewer.java:5166)
	at org.jkiss.dbeaver.model.runtime.AbstractJob.run(AbstractJob.java:119)
	at org.eclipse.core.internal.jobs.Worker.run(Worker.java:63)

UDT:

com.datastax.oss.driver.api.core.type.codec.CodecNotFoundException: Codec not found for requested operation: [UDT(scraper.prices_preview_data) <-> java.lang.String]
	at com.datastax.oss.driver.internal.core.type.codec.registry.CachingCodecRegistry.createCodec(CachingCodecRegistry.java:667)
	at com.datastax.oss.driver.internal.core.type.codec.registry.DefaultCodecRegistry$1.load(DefaultCodecRegistry.java:97)
	at com.datastax.oss.driver.internal.core.type.codec.registry.DefaultCodecRegistry$1.load(DefaultCodecRegistry.java:94)
	at com.datastax.oss.driver.shaded.guava.common.cache.LocalCache$LoadingValueReference.loadFuture(LocalCache.java:3527)
	at com.datastax.oss.driver.shaded.guava.common.cache.LocalCache$Segment.loadSync(LocalCache.java:2276)
	at com.datastax.oss.driver.shaded.guava.common.cache.LocalCache$Segment.lockedGetOrLoad(LocalCache.java:2154)
	at com.datastax.oss.driver.shaded.guava.common.cache.LocalCache$Segment.get(LocalCache.java:2044)
	at com.datastax.oss.driver.shaded.guava.common.cache.LocalCache.get(LocalCache.java:3951)
	at com.datastax.oss.driver.shaded.guava.common.cache.LocalCache.getOrLoad(LocalCache.java:3973)
	at com.datastax.oss.driver.shaded.guava.common.cache.LocalCache$LocalLoadingCache.get(LocalCache.java:4957)
	at com.datastax.oss.driver.shaded.guava.common.cache.LocalCache$LocalLoadingCache.getUnchecked(LocalCache.java:4963)
	at com.datastax.oss.driver.internal.core.type.codec.registry.DefaultCodecRegistry.getCachedCodec(DefaultCodecRegistry.java:119)
	at com.datastax.oss.driver.internal.core.type.codec.registry.CachingCodecRegistry.codecFor(CachingCodecRegistry.java:201)
	at com.datastax.oss.driver.internal.core.type.codec.registry.CachingCodecRegistry.getElementCodecForCqlAndJavaType(CachingCodecRegistry.java:598)
	at com.datastax.oss.driver.internal.core.type.codec.registry.CachingCodecRegistry.createCodec(CachingCodecRegistry.java:626)
	at com.datastax.oss.driver.internal.core.type.codec.registry.DefaultCodecRegistry$1.load(DefaultCodecRegistry.java:97)
	at com.datastax.oss.driver.internal.core.type.codec.registry.DefaultCodecRegistry$1.load(DefaultCodecRegistry.java:94)
	at com.datastax.oss.driver.shaded.guava.common.cache.LocalCache$LoadingValueReference.loadFuture(LocalCache.java:3527)
	at com.datastax.oss.driver.shaded.guava.common.cache.LocalCache$Segment.loadSync(LocalCache.java:2276)
	at com.datastax.oss.driver.shaded.guava.common.cache.LocalCache$Segment.lockedGetOrLoad(LocalCache.java:2154)
	at com.datastax.oss.driver.shaded.guava.common.cache.LocalCache$Segment.get(LocalCache.java:2044)
	at com.datastax.oss.driver.shaded.guava.common.cache.LocalCache.get(LocalCache.java:3951)
	at com.datastax.oss.driver.shaded.guava.common.cache.LocalCache.getOrLoad(LocalCache.java:3973)
	at com.datastax.oss.driver.shaded.guava.common.cache.LocalCache$LocalLoadingCache.get(LocalCache.java:4957)
	at com.datastax.oss.driver.shaded.guava.common.cache.LocalCache$LocalLoadingCache.getUnchecked(LocalCache.java:4963)
	at com.datastax.oss.driver.internal.core.type.codec.registry.DefaultCodecRegistry.getCachedCodec(DefaultCodecRegistry.java:119)
	at com.datastax.oss.driver.internal.core.type.codec.registry.CachingCodecRegistry.codecFor(CachingCodecRegistry.java:201)
	at com.datastax.oss.driver.internal.core.type.codec.registry.CachingCodecRegistry.codecFor(CachingCodecRegistry.java:180)
	at com.datastax.oss.driver.api.core.data.GettableByIndex.get(GettableByIndex.java:109)
	at com.datastax.oss.driver.api.core.data.GettableByIndex.getList(GettableByIndex.java:501)
	at com.ing.data.cassandra.jdbc.CassandraResultSet.getObject(CassandraResultSet.java:931)
	at org.jkiss.dbeaver.model.impl.jdbc.exec.JDBCResultSetImpl.getAttributeValue(JDBCResultSetImpl.java:157)
	at org.jkiss.dbeaver.model.impl.data.DefaultValueHandler.fetchValueObject(DefaultValueHandler.java:52)
	at org.jkiss.dbeaver.ui.controls.resultset.ResultSetDataReceiver.fetchRow(ResultSetDataReceiver.java:126)
	at org.jkiss.dbeaver.ui.editors.sql.execute.SQLQueryJob.fetchQueryData(SQLQueryJob.java:916)
	at org.jkiss.dbeaver.ui.editors.sql.execute.SQLQueryJob.executeStatement(SQLQueryJob.java:682)
	at org.jkiss.dbeaver.ui.editors.sql.execute.SQLQueryJob.lambda$2(SQLQueryJob.java:522)
	at org.jkiss.dbeaver.model.exec.DBExecUtils.tryExecuteRecover(DBExecUtils.java:192)
	at org.jkiss.dbeaver.ui.editors.sql.execute.SQLQueryJob.executeSingleQuery(SQLQueryJob.java:541)
	at org.jkiss.dbeaver.ui.editors.sql.execute.SQLQueryJob.extractData(SQLQueryJob.java:1016)
	at org.jkiss.dbeaver.ui.editors.sql.SQLEditor$QueryResultsContainer.readData(SQLEditor.java:4273)
	at org.jkiss.dbeaver.ui.controls.resultset.ResultSetJobDataRead.lambda$0(ResultSetJobDataRead.java:128)
	at org.jkiss.dbeaver.model.exec.DBExecUtils.tryExecuteRecover(DBExecUtils.java:192)
	at org.jkiss.dbeaver.ui.controls.resultset.ResultSetJobDataRead.run(ResultSetJobDataRead.java:126)
	at org.jkiss.dbeaver.ui.controls.resultset.ResultSetViewer$ResultSetDataPumpJob.run(ResultSetViewer.java:5166)
	at org.jkiss.dbeaver.model.runtime.AbstractJob.run(AbstractJob.java:119)
	at org.eclipse.core.internal.jobs.Worker.run(Worker.java:63)

Everything else seems to work fine. I am using the latest version (4.14.0)

@andreamatt
Copy link
Author

I use scylla btw

@maximevw maximevw reopened this Feb 8, 2025
@maximevw
Copy link
Collaborator

maximevw commented Feb 8, 2025

Regarding the issue with tinyint, by default this CQL type is mapped to Java type byte, but it could also be mapped to short by some tools using JDBC like DBeaver. So, I fixed the issue by registering a new codec TINYINT <-> Short by default (see commit 8d4f030).

@maximevw maximevw added bug Something isn't working to investigate Investigation needed and removed to investigate Investigation needed labels Feb 8, 2025
@maximevw
Copy link
Collaborator

maximevw commented Feb 8, 2025

The UDT issue should be fixed by the commit 82a0d79.

These bugfixes will be released in the next coming stable version 4.15.0.

@andreamatt
Copy link
Author

Thanks.
I tryed building and running the latest commit.
The tinyint is now working, but the UDT now shows 'defaultudtvalue'

Image

@maximevw
Copy link
Collaborator

Hello @andreamatt

Currently, UDTs are returned as com.datastax.oss.driver.api.core.data.UdtValue objects by this implementation of JDBC API, and it's probably not supported by DBeaver CE. That's why you see just the name of class as the string representation of the value, I guess.

So, I'll investigate asap what is the best way to return values displayable by tools like DBeaver.

@maximevw maximevw added the to investigate Investigation needed label Feb 11, 2025
@maximevw maximevw reopened this Feb 11, 2025
maximevw added a commit that referenced this issue Feb 16, 2025
This allows a human-readable string representation of UDT values in tools like DBeaver for example
@maximevw maximevw removed the to investigate Investigation needed label Feb 16, 2025
@maximevw
Copy link
Collaborator

Hello @andreamatt,

I pushed a new commit 1e5937f on the branch release/next. It should solve the issue to display UDT values in DBeaver and similar tools for most common cases. The solution supports UDT values in lists, sets and maps, and also directly in a column for the methods ResultSet.getObject(int | String). This might not work in complex use cases like nested UDT values or collections of UDTs (not currently tested).

Using your example, I got now:
Image

I'll let you test it by yourself.

@andreamatt
Copy link
Author

Thanks, it works, you are a god 😍

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
None yet
Development

No branches or pull requests

2 participants