[ 
https://issues.apache.org/jira/browse/IGNITE-23183?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Konstantin Orlov updated IGNITE-23183:
--------------------------------------
    Fix Version/s: 3.1

> 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
>             Fix For: 3.1
>
>          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)

Reply via email to