[ https://issues.apache.org/jira/browse/IGNITE-23183?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Konstantin Orlov reassigned IGNITE-23183: ----------------------------------------- Assignee: Konstantin Orlov > Sql. Assertion error when validating an UPDATE query with a subquery > expression > ------------------------------------------------------------------------------- > > Key: IGNITE-23183 > URL: https://issues.apache.org/jira/browse/IGNITE-23183 > Project: Ignite > Issue Type: Bug > Components: sql > Reporter: Pavel Pereslegin > Assignee: Konstantin Orlov > Priority: Major > Labels: ignite-3 > Time Spent: 20m > Remaining Estimate: 0h > > Reproducer: > {code:java} > sql("CREATE TABLE t0(ID INT PRIMARY KEY, VAL INT)"); > sql("UPDATE t0 set val = (select id::BIGINT from t0)"); > {code} > fails with > {noformat} > Caused by: java.lang.AssertionError > at > org.apache.calcite.sql.validate.implicit.AbstractTypeCoercion.needToCast(AbstractTypeCoercion.java:307) > at > org.apache.calcite.sql.validate.implicit.AbstractTypeCoercion.needToCast(AbstractTypeCoercion.java:250) > at > org.apache.ignite.internal.sql.engine.prepare.IgniteTypeCoercion.needToCast(IgniteTypeCoercion.java:321) > at > org.apache.ignite.internal.sql.engine.prepare.IgniteTypeCoercion.doCoerceColumnType(IgniteTypeCoercion.java:499) > at > org.apache.ignite.internal.sql.engine.prepare.IgniteTypeCoercion.coerceColumnType(IgniteTypeCoercion.java:406) > at > org.apache.calcite.sql.validate.implicit.TypeCoercionImpl.coerceSourceRowType(TypeCoercionImpl.java:676) > at > org.apache.calcite.sql.validate.implicit.TypeCoercionImpl.querySourceCoercion(TypeCoercionImpl.java:646) > at > org.apache.ignite.internal.sql.engine.prepare.IgniteTypeCoercion.querySourceCoercion(IgniteTypeCoercion.java:278) > at > org.apache.calcite.sql.validate.SqlValidatorImpl.checkTypeAssignment(SqlValidatorImpl.java:5272) > at > org.apache.calcite.sql.validate.SqlValidatorImpl.validateUpdate(SqlValidatorImpl.java:5379) > at > org.apache.ignite.internal.sql.engine.prepare.IgniteSqlValidator.validateUpdate(IgniteSqlValidator.java:229) > at org.apache.calcite.sql.SqlUpdate.validate(SqlUpdate.java:190) > at > org.apache.calcite.sql.validate.SqlValidatorImpl.validateScopedExpression(SqlValidatorImpl.java:1101) > at > org.apache.calcite.sql.validate.SqlValidatorImpl.validate(SqlValidatorImpl.java:807) > at > org.apache.ignite.internal.sql.engine.prepare.IgniteSqlValidator.validate(IgniteSqlValidator.java:176) > at > org.apache.ignite.internal.sql.engine.prepare.IgnitePlanner.validate(IgnitePlanner.java:200) > at > org.apache.ignite.internal.sql.engine.prepare.PrepareServiceImpl.lambda$prepareDml$8(PrepareServiceImpl.java:515) > {noformat} > Issue is caused by CALCITE-6570 > *UPDATE* > The following case (looks related) gives the *physical* plan with *logical > nodes* > {code:java} > sql("CREATE TABLE t0(ID INT PRIMARY KEY, A INT)"); > sql("INSERT INTO t0 VALUES (1, 1), (2, 2)"); > sql("UPDATE t0 SET a = a + (SELECT 1)"); > {code} > look at TableModify.sourceExpressionList > {noformat} > Project(ROWCOUNT=[CAST($0):BIGINT NOT NULL]): rowcount = 1.0, cumulative cost > = IgniteCost [rowCount=70004.0, cpu=100004.0, memory=11.0, io=2.0, > network=240002.0], id = 246 > ColocatedHashAggregate(group=[{}], agg#0=[$SUM0($0)]): rowcount = 1.0, > cumulative cost = IgniteCost [rowCount=70002.0, cpu=100002.0, memory=10.0, > io=1.0, network=240001.0], id = 245 > Exchange(distribution=[single]): rowcount = 10000.0, cumulative cost = > IgniteCost [rowCount=60002.0, cpu=90002.0, memory=5.0, io=1.0, > network=240001.0], id = 244 > TableModify(table=[[PUBLIC, T0]], operation=[UPDATE], > updateColumnList=[[A]], sourceExpressionList=[[+($1, $SCALAR_QUERY({ > LogicalValues(tuples=[[{ 1 }]]) > }))]], flattened=[false], tableId=[9]): rowcount = 10000.0, cumulative cost = > IgniteCost [rowCount=50002.0, cpu=80002.0, memory=5.0, io=1.0, > network=200001.0], id = 243 > Project(ID=[$0], A=[$1], EXPR$2=[+($1, $2)]): rowcount = 10000.0, > cumulative cost = IgniteCost [rowCount=50001.0, cpu=80001.0, memory=4.0, > io=0.0, network=200000.0], id = 242 > Exchange(distribution=[affinity[tableId=9, zoneId=9][0]]): rowcount > = 10000.0, cumulative cost = IgniteCost [rowCount=40001.0, cpu=70001.0, > memory=4.0, io=0.0, network=200000.0], id = 241 > NestedLoopJoin(condition=[true], joinType=[left], > variablesSet=[[]]): rowcount = 10000.0, cumulative cost = IgniteCost > [rowCount=30001.0, cpu=60001.0, memory=4.0, io=0.0, network=80000.0], id = 240 > Exchange(distribution=[single]): rowcount = 10000.0, cumulative > cost = IgniteCost [rowCount=20000.0, cpu=20000.0, memory=0.0, io=0.0, > network=80000.0], id = 238 > TableScan(table=[[PUBLIC, T0]], tableId=[9], > requiredColumns=[{0, 1}]): rowcount = 10000.0, cumulative cost = IgniteCost > [rowCount=10000.0, cpu=10000.0, memory=0.0, io=0.0, network=0.0], id = 237 > Values(tuples=[[{ 1 }]]): rowcount = 1.0, cumulative cost = > IgniteCost [rowCount=1.0, cpu=1.0, memory=0.0, io=0.0, network=0.0], id = 239 > {noformat} > that cannot be deserialized > {noformat} > Caused by: java.lang.IllegalStateException: Unknown or unexpected operator: > name: $SCALAR_QUERY, kind: SCALAR_QUERY, syntax: INTERNAL > at > org.apache.ignite.internal.sql.engine.externalize.RelJson.toOp(RelJson.java:944) > at > org.apache.ignite.internal.sql.engine.externalize.RelJson.toRex(RelJson.java:818) > at > org.apache.ignite.internal.sql.engine.externalize.RelJson.toRexList(RelJson.java:1042) > at > org.apache.ignite.internal.sql.engine.externalize.RelJson.toRex(RelJson.java:784) > at > org.apache.ignite.internal.sql.engine.externalize.RelJsonReader$RelInputImpl.getExpressionList(RelJsonReader.java:303) > at > org.apache.ignite.internal.sql.engine.rel.IgniteTableModify.<init>(IgniteTableModify.java:121) > at SC.apply(Unknown Source) > at > org.apache.ignite.internal.sql.engine.externalize.RelJson$RelFactory.apply(RelJson.java:129) > at > org.apache.ignite.internal.sql.engine.externalize.RelJsonReader.readRel(RelJsonReader.java:140) > at > org.apache.ignite.internal.sql.engine.externalize.RelJsonReader.readRels(RelJsonReader.java:132) > at > org.apache.ignite.internal.sql.engine.externalize.RelJsonReader.read(RelJsonReader.java:123) > at > org.apache.ignite.internal.sql.engine.externalize.RelJsonReader.fromJson(RelJsonReader.java:86) > at > org.apache.ignite.internal.sql.engine.exec.ExecutionServiceImpl.lambda$relationalTreeFromJsonString$8(ExecutionServiceImpl.java:362) > at > com.github.benmanes.caffeine.cache.BoundedLocalCache.lambda$doComputeIfAbsent$13(BoundedLocalCache.java:2457) > at > java.base/java.util.concurrent.ConcurrentHashMap.compute(ConcurrentHashMap.java:1908) > at > com.github.benmanes.caffeine.cache.BoundedLocalCache.doComputeIfAbsent(BoundedLocalCache.java:2455) > at > com.github.benmanes.caffeine.cache.BoundedLocalCache.computeIfAbsent(BoundedLocalCache.java:2438) > at > com.github.benmanes.caffeine.cache.LocalCache.computeIfAbsent(LocalCache.java:107) > at > org.apache.ignite.internal.sql.engine.exec.ExecutionServiceImpl.relationalTreeFromJsonString(ExecutionServiceImpl.java:360) > at > org.apache.ignite.internal.sql.engine.exec.ExecutionServiceImpl$DistributedQueryManager.submitFragment(ExecutionServiceImpl.java:947) > at > org.apache.ignite.internal.sql.engine.exec.ExecutionServiceImpl.submitFragment(ExecutionServiceImpl.java:614) > at > org.apache.ignite.internal.sql.engine.exec.ExecutionServiceImpl.onMessage(ExecutionServiceImpl.java:513) > at > org.apache.ignite.internal.sql.engine.exec.ExecutionServiceImpl.lambda$start$1(ExecutionServiceImpl.java:277) > at > org.apache.ignite.internal.sql.engine.message.MessageServiceImpl.onMessageInternal(MessageServiceImpl.java:151) > at > org.apache.ignite.internal.sql.engine.message.MessageServiceImpl.lambda$onMessage$0(MessageServiceImpl.java:115) > ... 4 more > {noformat} -- This message was sent by Atlassian Jira (v8.20.10#820010)