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

Tim Armstrong reopened IMPALA-4513:
-----------------------------------

> ABS(n) where n is the lowest bound for the int types returns negative values
> ----------------------------------------------------------------------------
>
>                 Key: IMPALA-4513
>                 URL: https://issues.apache.org/jira/browse/IMPALA-4513
>             Project: IMPALA
>          Issue Type: Bug
>          Components: Frontend
>    Affects Versions: Impala 3.0
>            Reporter: Michael Brown
>            Assignee: Zach Amsden
>            Priority: Major
>              Labels: correctness, incompatibility, query_generator
>             Fix For: Product Backlog
>
>
> The query generator found this on this query:
> {noformat}
> SELECT
> ABS(a1.tinyint_col_31) AS int_col
> FROM table_6 a1
> WHERE
> (a1.smallint_col_8) != (a1.tinyint_col_31)
> {noformat}
> In the database the query generator is using, tinyint_col_31 has all possible 
> tinyint values, from -128 to 127, and also null. One of the rows returned was 
> -128.
> The general problem seems to be we're not willing to "promote" the value to 
> another type to fit the correct answer in the literal case, and we don't 
> error in other cases where postgres does.  See below.
> Simpler examples just using literals:
> {noformat}
> [localhost:21000] > select abs(-128) --- lowest tinyint;
> +-----------+
> | abs(-128) |
> +-----------+
> | -128      |
> +-----------+
> Fetched 1 row(s) in 0.02s
> [localhost:21000] > select abs(-32768) --- lowest smallint;
> +-------------+
> | abs(-32768) |
> +-------------+
> | -32768      |
> +-------------+
> Fetched 1 row(s) in 0.02s
> [localhost:21000] > select abs(-2147483648) --- lowest int;
> +------------------+
> | abs(-2147483648) |
> +------------------+
> | -2147483648      |
> +------------------+
> Fetched 1 row(s) in 0.02s
> [localhost:21000] > select abs(-9223372036854775808) --- lowest bigint;
> +---------------------------+
> | abs(-9223372036854775808) |
> +---------------------------+
> | -9223372036854775808      |
> +---------------------------+
> Fetched 1 row(s) in 0.02s
> [localhost:21000] >
> {noformat}
> These work though:
> {noformat}
> [localhost:21000] > select abs(0-128);
> +--------------+
> | abs(0 - 128) |
> +--------------+
> | 128          |
> +--------------+
> Fetched 1 row(s) in 0.02s
> [localhost:21000] > select abs(-1*128);
> +-------------------+
> | abs(-1 * 1 * 128) |
> +-------------------+
> | 128               |
> +-------------------+
> Fetched 1 row(s) in 0.02s
> {noformat}
> Note that postgres does not have tinyint, only smallint.
> Here's some noteworthy behavior at the boundary for the smallest postgres 
> smallint:
> {noformat}
> randomness=# select abs(-32768);
>   abs
> -------
>  32768
> (1 row)
> randomness=# select abs(cast(-32768 as smallint));
> ERROR:  smallint out of range
> randomness=#
> {noformat}
> Last, this seems to work the same if I have some values stored in a smallint 
> column: Impala returns a negative value for the row, and postgres will error:
> Impala:
> {noformat}
> [localhost:21000] > select i from foo;
> +--------+
> | i      |
> +--------+
> | -32768 |
> | -32767 |
> | -1     |
> | 0      |
> | 1      |
> | 32767  |
> +--------+
> Fetched 6 row(s) in 0.15s
> [localhost:21000] > select abs(i) from foo;
> +--------+
> | abs(i) |
> +--------+
> | -32768 |
> | 32767  |
> | 1      |
> | 0      |
> | 1      |
> | 32767  |
> +--------+
> Fetched 6 row(s) in 0.15s
> [localhost:21000]
> {noformat}
> Postgres:
> {noformat}
> postgres=# select i from foo;
>    i
> --------
>  -32768
>  -32767
>      -1
>       0
>       1
>   32767
> (6 rows)
> postgres=# select abs(i) from foo;
> ERROR:  smallint out of range
> postgres=#
> {noformat}



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to