[
https://issues.apache.org/jira/browse/IGNITE-18644?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Maksim Zhuravkov updated IGNITE-18644:
--------------------------------------
Description:
Types in predicate expressions may have unnecessary casts that makes a result
of a query execution dependent on data that resides in a table. Observed for IN
operator and OR expressions b/c IN operator is rewritten as X in (a, b) is
rewritten into X = a OR X = b.
Table:
{code:java}
CREATE TABLE t1 (ID INTEGER PRIMARY KEY, c1 INTEGER);
{code}
Query:
{code:java}
SELECT c1 FROM t1 WHERE c1 IN (1, 2, 'b') {code}
Execution of the following query depends on data that is stored in a table:
- if c1 is 1 or 2 the following query does not raise an error.
- If c2 is neither of those the query fails at runtime with Integer parse
error.
it would be better to have consistent behaviour (this requires removing the
rendudant casts in predicate expressions).
Reproducer:
{code:java}
sql("CREATE TABLE T11 (c1 int primary key, c2 INTEGER)");
Transaction tx = CLUSTER_NODES.get(0).transactions().begin();
sql(tx, "INSERT INTO T11 VALUES(1, 2)");
sql(tx, "INSERT INTO T11 VALUES(2, 3)");
tx.commit();
// ok
assertQuery("SELECT T11.c2 FROM T11 WHERE c2 IN (2, 'b')").check();
// ok
assertQuery("SELECT T11.c2 FROM T11 WHERE c2 IN (3, 'b')").check();
// fails with java.lang.NumberFormatException: For input string: "b"
assertQuery("SELECT T11.c2 FROM T11 WHERE c2 IN (4, 'b')").check(); {code}
was:
Types in predicate expressions may have unnecessary casts that makes a result
of a query execution dependent depends on data that resides in a table.
Observed for IN operator and OR expressions b/c IN operator is rewritten as X
in (a, b) is rewritten into X = a OR X = b.
Table:
{code:java}
CREATE TABLE t1 (ID INTEGER PRIMARY KEY, c1 INTEGER);
{code}
Query:
{code:java}
SELECT c1 FROM t1 WHERE c1 IN (1, 2, 'b') {code}
Execution of the following query depends on data that is stored in a table:
- if c1 is 1 or 2 the following query does not raise an error.
- If c2 is neither of those the query fails at runtime with Integer parse
error.
it would be better to have consistent behaviour (this requires removing the
rendudant casts in predicate expressions).
Reproducer:
{code:java}
sql("CREATE TABLE T11 (c1 int primary key, c2 INTEGER)");
Transaction tx = CLUSTER_NODES.get(0).transactions().begin();
sql(tx, "INSERT INTO T11 VALUES(1, 2)");
sql(tx, "INSERT INTO T11 VALUES(2, 3)");
tx.commit();
// ok
assertQuery("SELECT T11.c2 FROM T11 WHERE c2 IN (2, 'b')").check();
// ok
assertQuery("SELECT T11.c2 FROM T11 WHERE c2 IN (3, 'b')").check();
// fails with java.lang.NumberFormatException: For input string: "b"
assertQuery("SELECT T11.c2 FROM T11 WHERE c2 IN (4, 'b')").check(); {code}
> Sql. Type system. Types in predicate expressions may have unnecessary casts.
> ----------------------------------------------------------------------------
>
> Key: IGNITE-18644
> URL: https://issues.apache.org/jira/browse/IGNITE-18644
> Project: Ignite
> Issue Type: Bug
> Components: sql
> Reporter: Maksim Zhuravkov
> Priority: Major
> Labels: calcite3-required, ignite-3
>
> Types in predicate expressions may have unnecessary casts that makes a result
> of a query execution dependent on data that resides in a table. Observed for
> IN operator and OR expressions b/c IN operator is rewritten as X in (a, b) is
> rewritten into X = a OR X = b.
> Table:
> {code:java}
> CREATE TABLE t1 (ID INTEGER PRIMARY KEY, c1 INTEGER);
> {code}
> Query:
> {code:java}
> SELECT c1 FROM t1 WHERE c1 IN (1, 2, 'b') {code}
> Execution of the following query depends on data that is stored in a table:
> - if c1 is 1 or 2 the following query does not raise an error.
> - If c2 is neither of those the query fails at runtime with Integer parse
> error.
> it would be better to have consistent behaviour (this requires removing the
> rendudant casts in predicate expressions).
> Reproducer:
> {code:java}
> sql("CREATE TABLE T11 (c1 int primary key, c2 INTEGER)");
> Transaction tx = CLUSTER_NODES.get(0).transactions().begin();
> sql(tx, "INSERT INTO T11 VALUES(1, 2)");
> sql(tx, "INSERT INTO T11 VALUES(2, 3)");
> tx.commit();
> // ok
> assertQuery("SELECT T11.c2 FROM T11 WHERE c2 IN (2, 'b')").check();
> // ok
> assertQuery("SELECT T11.c2 FROM T11 WHERE c2 IN (3, 'b')").check();
> // fails with java.lang.NumberFormatException: For input string: "b"
> assertQuery("SELECT T11.c2 FROM T11 WHERE c2 IN (4, 'b')").check(); {code}
>
--
This message was sent by Atlassian Jira
(v8.20.10#820010)