Skip to content
New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

Inconsistent cast conversion in Tiflash #9653

Open
curry-oss opened this issue Nov 19, 2024 · 6 comments
Open

Inconsistent cast conversion in Tiflash #9653

curry-oss opened this issue Nov 19, 2024 · 6 comments

Comments

@curry-oss
Copy link

curry-oss commented Nov 19, 2024

Bug Report

Please answer these questions before submitting your issue. Thanks!

1. Minimal reproduce step (Required)

Drop table if exists test_table;
CREATE TABLE test_table (
    id INT PRIMARY KEY AUTO_INCREMENT,
    col1 VARCHAR(255),
    col2 TINYINT,
    col3 SMALLINT
);

INSERT INTO test_table (col1, col2, col3) VALUES
    ('-9223372036854775809', -128, -32768),
    ('-9223372036854775808', 127, 32767);

ALTER TABLE test_table SET TIFLASH REPLICA 1;

SELECT /*+ READ_FROM_STORAGE(TIKV[test_table])*/
    id,
    col1,
    CAST(col1 AS SIGNED) AS signed_int,
    CAST(col1 AS UNSIGNED) AS unsigned_int,
    CAST(col1 AS DECIMAL(65,30)) AS decimal_value,
    CAST(col1 AS DOUBLE) AS double_value
FROM
    test_table;
    
SELECT /*+ READ_FROM_STORAGE(TIFLASH[test_table])*/
    id,
    col1,
    CAST(col1 AS SIGNED) AS signed_int,
    CAST(col1 AS UNSIGNED) AS unsigned_int,
    CAST(col1 AS DECIMAL(65,30)) AS decimal_value,
    CAST(col1 AS DOUBLE) AS double_value
FROM
    test_table;

2. What did you expect to see? (Required)

I find that unsigned_int is inconsistent across two queries.

3. What did you see instead (Required)

mysql> SELECT /*+ READ_FROM_STORAGE(TIKV[test_table])*/
    ->     id,
    ->     col1,
    ->     CAST(col1 AS SIGNED) AS signed_int,
    ->     CAST(col1 AS UNSIGNED) AS unsigned_int,
    ->     CAST(col1 AS DECIMAL(65,30)) AS decimal_value,
    ->     CAST(col1 AS DOUBLE) AS double_value
    -> FROM
    ->     test_table;
+----+----------------------+----------------------+---------------------+-----------------------------------------------------+-----------------------+
| id | col1                 | signed_int           | unsigned_int        | decimal_value                                       | double_value          |
+----+----------------------+----------------------+---------------------+-----------------------------------------------------+-----------------------+
|  1 | -9223372036854775809 | -9223372036854775808 | 9223372036854775808 | -9223372036854775809.000000000000000000000000000000 | -9.223372036854776e18 |
|  2 | -9223372036854775808 | -9223372036854775808 | 9223372036854775808 | -9223372036854775808.000000000000000000000000000000 | -9.223372036854776e18 |
+----+----------------------+----------------------+---------------------+-----------------------------------------------------+-----------------------+
2 rows in set, 4 warnings (0.01 sec)

mysql> SELECT /*+ READ_FROM_STORAGE(TIFLASH[test_table])*/     id,     col1,     CAST(col1 AS SIGNED) AS signed_int,     CAST(col1 AS UNSIGNED) AS unsigned_int,     CAST(col1 AS DECIMAL(65,30)) AS decimal_value,     CAST(col1 AS DOUBLE) AS double_value FROM
  test_table;
+----+----------------------+----------------------+---------------------+-----------------------------------------------------+-----------------------+
| id | col1                 | signed_int           | unsigned_int        | decimal_value                                       | double_value          |
+----+----------------------+----------------------+---------------------+-----------------------------------------------------+-----------------------+
|  1 | -9223372036854775809 | -9223372036854775808 |                   0 | -9223372036854775809.000000000000000000000000000000 | -9.223372036854776e18 |
|  2 | -9223372036854775808 | -9223372036854775808 | 9223372036854775808 | -9223372036854775808.000000000000000000000000000000 | -9.223372036854776e18 |
+----+----------------------+----------------------+---------------------+-----------------------------------------------------+-----------------------+
2 rows in set (0.01 sec)

4. What is your TiDB version? (Required)

TiDB v8.4.0

@curry-oss curry-oss added the type/bug The issue is confirmed as a bug. label Nov 19, 2024
@curry-oss
Copy link
Author

/label affects-8.4

@curry-oss
Copy link
Author

/label affects-8.5

@ti-chi-bot ti-chi-bot bot added the affects-8.5 This bug affects the 8.5.x(LTS) versions. label Nov 19, 2024
@curry-oss
Copy link
Author

curry-oss commented Nov 22, 2024

@jebter Hello, could you help us check this bug, and #9654 && #9664? We would like to know whether this inconsistency is permitted. Thanks!

@yibin87
Copy link
Contributor

yibin87 commented Nov 25, 2024

Confirm that tidb, mysql gets 9223372036854775808 for cast('-9223372036854775808' as UNSIGNED). Thus TiFlash needs to be consistent with tidb, we'll fix this behavior.

@yibin87
Copy link
Contributor

yibin87 commented Nov 25, 2024

And for other negative strings than "-9223372036854775808", tiflash works the same as tidb.

@curry-oss
Copy link
Author

Thanks for your kind reply~

# for free to join this conversation on GitHub. Already have an account? # to comment
Projects
None yet
Development

No branches or pull requests

4 participants