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

Maksim Zhuravkov updated IGNITE-21736:
--------------------------------------
    Description: 
IGNITE-19615 introduced saturated values to overcome a problem in index 
lookups, caused by the fact that SQL allows implict conversions between numeric 
types.
This approach is not effiecent because instead of immediately returning an 
empty collection of rows, IndexScanNode performs a look up for TYPE::MAX_VALUE 
and then applying post condition to remove rows (See example).

1. Let's fix remove this redudant lookup by introducing/updating search bounds 
that represent unsatisfiable/impossible conditions (conditions that never hold 
true). 
2. Let's fix code related to introduction of saturated values to use these 
bounds.
3. Update IndexScanNode to always produce no rows in cause when impossible 
bounds are being used.     

Example:
{code:java}
 SELECT * FROM t WHERE t.tinyint_col = 1111111111     
{code}
With type annotations:
{code:java}
SELECT * FROM t WHERE t.t.tinyint_col (TINYINT) = 1111111111 (INT)
{code}
After applying type coercions rules:
{code:java}
SELECT * FROM t WHERE CAST(t.tiny_int AS INT) = 1111111111

// Behaviour:
// This query performs an index look up to return all rows that have 
tinyint_col = SHORT::MAX_VALUE
// Then it applies a predicate CAST(tinyint_col) = 1111111111 (to eliminate all 
results)
{code}



  was:
IGNITE-19615 introduced saturated values to overcome a problem in index 
lookups, caused by the fact that SQL allows implict conversions between numeric 
types.
This approach is not effiecent because instead of immediately returning an 
empty collection of rows, IndexScanNode performs a look up for TYPE::MAX_VALUE 
and then applying post condition to remove rows (See example).

1. Let's fix remove this redudant lookup by introducing/updating search bounds 
that represent unsatisfiable/impossible conditions (conditions that never hold 
true). 
2. Let's fix code related to introduction of saturated values to use these 
bounds.
3. Update IndexScanNode to always produce no rows in cause when impossible 
bounds are being used.     

Example:
{code:java}
 SELECT * FROM t WHERE t.tinyint_col = 1111111111     
{code}
With type annotations:
{code:java}
SELECT * FROM t WHERE t.t.tinyint_col (TINYINT) = 1111111111 (INT)
{code}
After applying type coercions rules:
{code:java}
SELECT * FROM t WHERE CAST(t.tiny_int AS INT) = 1111111111

// Behaviour:
// This operation perform an index look up to return all rows that have 
tinyint_col = SHORT::MAX_VALUE
// Then it applies a predicate CAST(tinyint_col) = 1111111111 (to eliminate all 
results)
{code}




> Sql. Do not perform index scan operations for impossible search conditions 
> for numeric literals.
> ------------------------------------------------------------------------------------------------
>
>                 Key: IGNITE-21736
>                 URL: https://issues.apache.org/jira/browse/IGNITE-21736
>             Project: Ignite
>          Issue Type: Improvement
>          Components: sql
>            Reporter: Maksim Zhuravkov
>            Priority: Minor
>              Labels: ignite-3
>             Fix For: 3.0.0-beta2
>
>
> IGNITE-19615 introduced saturated values to overcome a problem in index 
> lookups, caused by the fact that SQL allows implict conversions between 
> numeric types.
> This approach is not effiecent because instead of immediately returning an 
> empty collection of rows, IndexScanNode performs a look up for 
> TYPE::MAX_VALUE and then applying post condition to remove rows (See example).
> 1. Let's fix remove this redudant lookup by introducing/updating search 
> bounds that represent unsatisfiable/impossible conditions (conditions that 
> never hold true). 
> 2. Let's fix code related to introduction of saturated values to use these 
> bounds.
> 3. Update IndexScanNode to always produce no rows in cause when impossible 
> bounds are being used.     
> Example:
> {code:java}
>  SELECT * FROM t WHERE t.tinyint_col = 1111111111     
> {code}
> With type annotations:
> {code:java}
> SELECT * FROM t WHERE t.t.tinyint_col (TINYINT) = 1111111111 (INT)
> {code}
> After applying type coercions rules:
> {code:java}
> SELECT * FROM t WHERE CAST(t.tiny_int AS INT) = 1111111111
> // Behaviour:
> // This query performs an index look up to return all rows that have 
> tinyint_col = SHORT::MAX_VALUE
> // Then it applies a predicate CAST(tinyint_col) = 1111111111 (to eliminate 
> all results)
> {code}



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to