[MDEV-12849] Out-of-range errors when casting hex-hybrid to SIGNED and UNSIGNED Created: 2017-05-19  Updated: 2017-05-19  Resolved: 2017-05-19

Status: Closed
Project: MariaDB Server
Component/s: OTHER
Affects Version/s: 10.2, 10.3
Fix Version/s: 10.3.1

Type: Bug Priority: Major
Reporter: Alexander Barkov Assignee: Alexander Barkov
Resolution: Fixed Votes: 0
Labels: datatype

Issue Links:
Blocks
blocks MDEV-4912 Data type plugin API version 1 Closed
Relates
relates to MDEV-12852 Out-of-range errors when CAST(1-2 AS ... Closed
relates to MDEV-12852 Out-of-range errors when CAST(1-2 AS ... Closed
relates to MDEV-12853 Out-of-range errors when CAST('-1' AS... Closed

 Description   

These queries work fine:

CREATE OR REPLACE TABLE t1 AS SELECT CAST(0xFF AS UNSIGNED);
CREATE OR REPLACE TABLE t1 AS SELECT CAST(0xFFFF AS UNSIGNED);
CREATE OR REPLACE TABLE t1 AS SELECT CAST(0xFFFFFF AS UNSIGNED);
CREATE OR REPLACE TABLE t1 AS SELECT CAST(0xFFFFFFFF AS UNSIGNED);

There queries return an error:

CREATE OR REPLACE TABLE t1 AS SELECT CAST(0xFFFFFFFFFF AS UNSIGNED);
CREATE OR REPLACE TABLE t1 AS SELECT CAST(0xFFFFFFFFFFFF AS UNSIGNED);
CREATE OR REPLACE TABLE t1 AS SELECT CAST(0xFFFFFFFFFFFFFF AS UNSIGNED);
CREATE OR REPLACE TABLE t1 AS SELECT CAST(0xFFFFFFFFFFFFFFFF AS UNSIGNED);

ERROR 1264 (22003): Out of range value for column 'CAST(0xFFFFFFFFFF AS UNSIGNED)' at row 1

Adding LIMIT 0 helps to create the table and see what's the problem:

CREATE OR REPLACE TABLE t1 AS
SELECT
  CAST(0xFFFFFFFFFF AS UNSIGNED),
  CAST(0xFFFFFFFFFFFF AS UNSIGNED),
  CAST(0xFFFFFFFFFFFFFF AS UNSIGNED),
  CAST(0xFFFFFFFFFFFFFFFF AS UNSIGNED) LIMIT 0;
DESCRIBE t1;

+--------------------------------------+-----------------+------+-----+---------+-------+
| Field                                | Type            | Null | Key | Default | Extra |
+--------------------------------------+-----------------+------+-----+---------+-------+
| CAST(0xFFFFFFFFFF AS UNSIGNED)       | int(5) unsigned | NO   |     | NULL    |       |
| CAST(0xFFFFFFFFFFFF AS UNSIGNED)     | int(6) unsigned | NO   |     | NULL    |       |
| CAST(0xFFFFFFFFFFFFFF AS UNSIGNED)   | int(7) unsigned | NO   |     | NULL    |       |
| CAST(0xFFFFFFFFFFFFFFFF AS UNSIGNED) | int(8) unsigned | NO   |     | NULL    |       |
+--------------------------------------+-----------------+------+-----+---------+-------+

Notice, it creates too small columns. All hex hybrids with more than 8 hexadecimal digits should create BIGINT columns.

The same problem is repeatable for SIGNED type cast:

These queries work fine:

CREATE OR REPLACE TABLE t1 AS SELECT CAST(0xFF AS SIGNED);
CREATE OR REPLACE TABLE t1 AS SELECT CAST(0xFFFF AS SIGNED);
CREATE OR REPLACE TABLE t1 AS SELECT CAST(0xFFFFFF AS SIGNED);

These queries return the same error:

CREATE OR REPLACE TABLE t1 AS SELECT CAST(0xFFFFFFFF AS SIGNED);
CREATE OR REPLACE TABLE t1 AS SELECT CAST(0xFFFFFFFFFF AS SIGNED);
CREATE OR REPLACE TABLE t1 AS SELECT CAST(0xFFFFFFFFFFFF AS SIGNED);
CREATE OR REPLACE TABLE t1 AS SELECT CAST(0xFFFFFFFFFFFFFF AS SIGNED);

ERROR 1264 (22003): Out of range value for column 'CAST(0xFFFFFFFFFFFFFF AS SIGNED)' at row 1

This query works fine again:

CREATE OR REPLACE TABLE t1 AS SELECT CAST(0xFFFFFFFFFFFFFFFF AS SIGNED);



 Comments   
Comment by Alexander Barkov [ 2017-05-19 ]

Pushed to bb-10.2-compatibility

Generated at Thu Feb 08 08:00:58 UTC 2024 using Jira 8.20.16#820016-sha1:9d11dbea5f4be3d4cc21f03a88dd11d8c8687422.