[MDEV-16347] Integer literal is typed as MYSQL_TYPE_LONG Created: 2018-05-31 Updated: 2020-11-05 Resolved: 2018-05-31 |
|
| Status: | Closed |
| Project: | MariaDB Server |
| Component/s: | Data types |
| Affects Version/s: | 10.3.7 |
| Fix Version/s: | N/A |
| Type: | Bug | Priority: | Minor |
| Reporter: | Bradley Grainger | Assignee: | Alexander Barkov |
| Resolution: | Not a Bug | Votes: | 0 |
| Labels: | datatype, protocol | ||
| Environment: |
mariadb:10.3.7 Docker image, i.e., Debian Jessie |
||
| Attachments: |
|
||||||||||||||||||||
| Issue Links: |
|
||||||||||||||||||||
| Description |
|
In MariaDB 10.2 (and MySQL 5.7, MySQL 8.0), executing SELECT 1; returns a text result set where the column definition packet specifies a type of MYSQL_TYPE_LONGLONG (0x08), i.e., a 64-bit integer. In MariaDB 10.3, the same query returns a text result set with the type MYSQL_TYPE_LONG (0x03), i.e., a 32-bit integer. I've attached two packet captures that show the difference: dump-10_2.pcap and dump-10_3.pcap. This could be a breaking protocol change for strongly-typed clients. For example, in .NET (with the Connector/NET or MySqlConnector libraries), the following code has a breaking change:
In .NET, there are workarounds, such as Convert.ToInt32. And perhaps this kind of statement is rare in practice. And while the protocol documentation doesn't specify (AFAIK) how numeric literals should be represented on the wire, I didn't find documentation of this as a deliberate change in behaviour. Note that SELECT 100000000000; (or some other number outside of the range of a 32-bit signed integer) will automatically promote the type in the result set to LONGLONG. |
| Comments |
| Comment by Elena Stepanova [ 2018-05-31 ] | |||||||||||||||||||||||||||||||||||||||||||||||||||
|
It looks like an intentional change made in this commit:
Assigning to bar to confirm/clarify. | |||||||||||||||||||||||||||||||||||||||||||||||||||
| Comment by Alexander Barkov [ 2018-05-31 ] | |||||||||||||||||||||||||||||||||||||||||||||||||||
|
It was an intentional change to have SELECT 1 return the result set metadata according to what column type is created on CREATE TABLE t1 AS SELECT 1 AS c1. | |||||||||||||||||||||||||||||||||||||||||||||||||||
| Comment by Bradley Grainger [ 2018-05-31 ] | |||||||||||||||||||||||||||||||||||||||||||||||||||
|
Caused by a change made for | |||||||||||||||||||||||||||||||||||||||||||||||||||
| Comment by Vladislav Vaintroub [ 2018-05-31 ] | |||||||||||||||||||||||||||||||||||||||||||||||||||
|
Also,
|