Aleksey Plekhanov created IGNITE-28755:
------------------------------------------
Summary: Calcite engine. Avoid typeId collisions for autogenerated
type names
Key: IGNITE-28755
URL: https://issues.apache.org/jira/browse/IGNITE-28755
Project: Ignite
Issue Type: Improvement
Reporter: Aleksey Plekhanov
Assignee: Aleksey Plekhanov
When table is created via DDL type name for key or value can be explicetely
provided, but if not provided it generated using pattern:
{{SQL_<schema>_<table>_<random UUID>}}, or {{SQL_<schema>_<table>_<random
UUID>_KEY}}.
Sometimes these autogenerated types have collisions with predefined or other
user types. User will get exception only after first insert to this table.
When types are provided explicetely they are also can have collisions with
already registered types, and again, exception will be thrown only on first
insert.
We should check typeId collision on table creation via DDL. In case of explicit
type - thow an exception, in case of implicit autogenerated type name -
regenerate type name to avoid collisions.
Failed test on TC:
https://ci2.ignite.apache.org/viewLog.html?buildTypeId=IgniteTests24Java8_CalciteSql3&buildId=9097118
{noformat}
[2026-05-30T21:55:16,227][ERROR][main][] Test failed
[test=SetOpIntegrationTest#testNumbersCastInIntersect[sqlTxMode=ALL],
duration=898]
class org.apache.ignite.internal.processors.query.IgniteSQLException: An error
occurred while query executing - Failed to register class.
at
org.apache.ignite.internal.processors.query.calcite.exec.rel.RootNode.checkException(RootNode.java:325)
at
org.apache.ignite.internal.processors.query.calcite.exec.rel.RootNode.exchangeBuffers(RootNode.java:314)
at
org.apache.ignite.internal.processors.query.calcite.exec.rel.RootNode.hasNext(RootNode.java:213)
at
org.apache.ignite.internal.processors.query.calcite.util.ConvertingClosableIterator.hasNext(ConvertingClosableIterator.java:71)
at
org.apache.ignite.internal.processors.query.calcite.exec.ClosableIteratorsHolder$DelegatingIterator.hasNext(ClosableIteratorsHolder.java:138)
at
org.apache.ignite.internal.processors.query.calcite.exec.ExecutionServiceImpl.executePlan(ExecutionServiceImpl.java:528)
at
org.apache.ignite.internal.processors.query.calcite.CalciteQueryProcessor.lambda$parseAndProcessQuery$6(CalciteQueryProcessor.java:588)
at
org.apache.ignite.internal.processors.query.calcite.CalciteQueryProcessor.processQuery(CalciteQueryProcessor.java:752)
at
org.apache.ignite.internal.processors.query.calcite.CalciteQueryProcessor.parseAndProcessQuery(CalciteQueryProcessor.java:576)
at
org.apache.ignite.internal.processors.query.calcite.CalciteQueryProcessor.query(CalciteQueryProcessor.java:445)
at
org.apache.ignite.internal.processors.query.calcite.integration.AbstractBasicIntegrationTest.sql(AbstractBasicIntegrationTest.java:273)
at
org.apache.ignite.internal.processors.query.calcite.integration.AbstractBasicIntegrationTransactionalTest.sql(AbstractBasicIntegrationTransactionalTest.java:142)
at
org.apache.ignite.internal.processors.query.calcite.integration.AbstractBasicIntegrationTest.sql(AbstractBasicIntegrationTest.java:258)
at
org.apache.ignite.internal.processors.query.calcite.integration.SetOpIntegrationTest.doTestNumbersCastInSetOp(SetOpIntegrationTest.java:566)
at
org.apache.ignite.internal.processors.query.calcite.integration.SetOpIntegrationTest.testNumbersCastInIntersect(SetOpIntegrationTest.java:532)
at
java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at
java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at
java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at
org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at
org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at
org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at
org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at
org.apache.ignite.testframework.junits.GridAbstractTest$6.run(GridAbstractTest.java:2486)
at java.base/java.lang.Thread.run(Thread.java:829)
Caused by: class org.apache.ignite.binary.BinaryObjectException: Failed to
register class.
at
org.apache.ignite.internal.binary.BinaryContext.registerUserClassName(BinaryContext.java:1240)
at
org.apache.ignite.internal.binary.BinaryContext.updateMetaIfNeeded(BinaryContext.java:1389)
at
org.apache.ignite.internal.binary.builder.BinaryObjectBuilderImpl.serializeTo(BinaryObjectBuilderImpl.java:340)
at
org.apache.ignite.internal.binary.builder.BinaryObjectBuilderImpl.build(BinaryObjectBuilderImpl.java:188)
at
org.apache.ignite.internal.processors.query.calcite.schema.CacheTableDescriptorImpl.insertTuple(CacheTableDescriptorImpl.java:330)
at
org.apache.ignite.internal.processors.query.calcite.schema.CacheTableDescriptorImpl.toTuple(CacheTableDescriptorImpl.java:312)
at
org.apache.ignite.internal.processors.query.calcite.exec.rel.ModifyNode.push(ModifyNode.java:133)
at
org.apache.ignite.internal.processors.query.calcite.exec.rel.ProjectNode.push(ProjectNode.java:63)
at
org.apache.ignite.internal.processors.query.calcite.exec.rel.ScanNode.processNextBatch(ScanNode.java:186)
at
org.apache.ignite.internal.processors.query.calcite.exec.rel.ScanNode.push(ScanNode.java:142)
at
org.apache.ignite.internal.processors.query.calcite.exec.rel.ScanNode.request(ScanNode.java:95)
at
org.apache.ignite.internal.processors.query.calcite.exec.rel.ProjectNode.request(ProjectNode.java:54)
at
org.apache.ignite.internal.processors.query.calcite.exec.rel.ModifyNode.tryEnd(ModifyNode.java:183)
at
org.apache.ignite.internal.processors.query.calcite.exec.rel.ModifyNode.request(ModifyNode.java:120)
at
org.apache.ignite.internal.processors.query.calcite.exec.rel.RootNode.lambda$exchangeBuffers$b615d61c$1(RootNode.java:292)
at org.apache.ignite.internal.util.lang.RunnableX.run(RunnableX.java:37)
at
org.apache.ignite.internal.processors.query.calcite.exec.ExecutionContext.lambda$execute$1(ExecutionContext.java:430)
at
org.apache.ignite.internal.processors.query.calcite.exec.task.AbstractQueryTaskExecutor$SecurityAwareTask.run(AbstractQueryTaskExecutor.java:78)
at
java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
at
java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
... 1 more
Caused by: class org.apache.ignite.internal.DuplicateTypeIdException: Duplicate
ID [platformId=0, typeId=-179778976,
oldCls=org.apache.ignite.transactions.TransactionConcurrency,
newCls=SQL_PUBLIC_T1_85fe3916_800f_40de_9e8f_8dbbae60c04d_KEY]
at
org.apache.ignite.internal.MarshallerContextImpl.registerClassName(MarshallerContextImpl.java:313)
at
org.apache.ignite.internal.binary.BinaryContext.registerUserClassName(BinaryContext.java:1224)
{noformat}
--
This message was sent by Atlassian Jira
(v8.20.10#820010)