fix!: align numeric type aliases with PostgreSQL and MySQL (#7270)

* fix: align numeric type aliases with those used in PostgreSQL and MySQL

Signed-off-by: Dennis Zhuang <killme2008@gmail.com>

* chore: update create_type_alias test

Signed-off-by: Dennis Zhuang <killme2008@gmail.com>

* chore: fix colon

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Signed-off-by: Dennis Zhuang <killme2008@gmail.com>

* fix: clone

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Signed-off-by: Dennis Zhuang <killme2008@gmail.com>

* fix: style

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Signed-off-by: Dennis Zhuang <killme2008@gmail.com>

---------

Signed-off-by: Dennis Zhuang <killme2008@gmail.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
This commit is contained in:
dennis zhuang
2025-11-21 12:49:17 +08:00
committed by GitHub
parent c13febe35d
commit 0b4f00feef
5 changed files with 101 additions and 27 deletions

View File

@@ -898,7 +898,13 @@ pub(super) fn parameters_to_scalar_values(
.and_then(|t| t.as_ref());
let client_type = if let Some(client_given_type) = client_param_types.get(idx) {
client_given_type.clone()
match (client_given_type, server_type) {
(&Type::UNKNOWN, Some(server_type)) => {
// If client type is unknown, use the server type.
type_gt_to_pg(server_type).map_err(convert_err)?
}
_ => client_given_type.clone(),
}
} else if let Some(server_provided_type) = &server_type {
type_gt_to_pg(server_provided_type).map_err(convert_err)?
} else {

View File

@@ -33,12 +33,21 @@ use crate::statements::{TimezoneInfo, sql_data_type_to_concrete_data_type};
/// - `TimestampMillisecond`, `Timestamp_ms` for `Timestamp(3)`.
/// - `TimestampMicrosecond`, `Timestamp_us` for `Timestamp(6)`.
/// - `TimestampNanosecond`, `Timestamp_ns` for `Timestamp(9)`.
/// - `INT8` for `tinyint`
/// - TinyText, MediumText, LongText for `Text`.
///
/// SQL dialect integer type aliases (MySQL & PostgreSQL):
/// - `INT2` for `smallint`
/// - `INT4` for `int`
/// - `INT8` for `bigint`
/// - `FLOAT4` for `float`
/// - `FLOAT8` for `double`
///
/// Extended type aliases for Arrow types:
/// - `INT16` for `smallint`
/// - `INT32` for `int`
/// - `INT64` for `bigint`
/// - And `UINT8`, `UINT16` etc. for `TinyIntUnsigned` etc.
/// - TinyText, MediumText, LongText for `Text`.
///
pub(crate) struct TypeAliasTransformRule;
impl TransformRule for TypeAliasTransformRule {
@@ -153,13 +162,12 @@ fn replace_type_alias(data_type: &mut DataType) {
// Remember to update `get_data_type_by_alias_name()` if you modify this method.
pub(crate) fn get_type_by_alias(data_type: &DataType) -> Option<DataType> {
match data_type {
// The sqlparser latest version contains the Int8 alias for Postgres Bigint.
// Which means 8 bytes in postgres (not 8 bits).
// See https://docs.rs/sqlparser/latest/sqlparser/ast/enum.DataType.html#variant.Int8
DataType::Custom(name, tokens) if name.0.len() == 1 && tokens.is_empty() => {
get_data_type_by_alias_name(name.0[0].to_string_unquoted().as_str())
}
DataType::Int8(None) => Some(DataType::TinyInt(None)),
DataType::Int2(None) => Some(DataType::SmallInt(None)),
DataType::Int4(None) => Some(DataType::Int(None)),
DataType::Int8(None) => Some(DataType::BigInt(None)),
DataType::Int16 => Some(DataType::SmallInt(None)),
DataType::Int32 => Some(DataType::Int(None)),
DataType::Int64 => Some(DataType::BigInt(None)),
@@ -167,6 +175,8 @@ pub(crate) fn get_type_by_alias(data_type: &DataType) -> Option<DataType> {
DataType::UInt16 => Some(DataType::SmallIntUnsigned(None)),
DataType::UInt32 => Some(DataType::IntUnsigned(None)),
DataType::UInt64 => Some(DataType::BigIntUnsigned(None)),
DataType::Float4 => Some(DataType::Float(None)),
DataType::Float8 => Some(DataType::Double(ExactNumberInfo::None)),
DataType::Float32 => Some(DataType::Float(None)),
DataType::Float64 => Some(DataType::Double(ExactNumberInfo::None)),
DataType::Bool => Some(DataType::Boolean),
@@ -199,8 +209,9 @@ pub(crate) fn get_data_type_by_alias_name(name: &str) -> Option<DataType> {
Some(DataType::Timestamp(Some(9), TimezoneInfo::None))
}
// Number type alias
// We keep them for backward compatibility.
"INT8" => Some(DataType::TinyInt(None)),
"INT2" => Some(DataType::SmallInt(None)),
"INT4" => Some(DataType::Int(None)),
"INT8" => Some(DataType::BigInt(None)),
"INT16" => Some(DataType::SmallInt(None)),
"INT32" => Some(DataType::Int(None)),
"INT64" => Some(DataType::BigInt(None)),
@@ -208,6 +219,8 @@ pub(crate) fn get_data_type_by_alias_name(name: &str) -> Option<DataType> {
"UINT16" => Some(DataType::SmallIntUnsigned(None)),
"UINT32" => Some(DataType::IntUnsigned(None)),
"UINT64" => Some(DataType::BigIntUnsigned(None)),
"FLOAT4" => Some(DataType::Float(None)),
"FLOAT8" => Some(DataType::Double(ExactNumberInfo::None)),
"FLOAT32" => Some(DataType::Float(None)),
"FLOAT64" => Some(DataType::Double(ExactNumberInfo::None)),
// String type alias
@@ -238,14 +251,29 @@ mod tests {
get_data_type_by_alias_name("FLOAT64"),
Some(DataType::Double(ExactNumberInfo::None))
);
assert_eq!(
get_data_type_by_alias_name("float32"),
Some(DataType::Float(None))
);
assert_eq!(
get_data_type_by_alias_name("float8"),
Some(DataType::Double(ExactNumberInfo::None))
);
assert_eq!(
get_data_type_by_alias_name("float4"),
Some(DataType::Float(None))
);
assert_eq!(
get_data_type_by_alias_name("int8"),
Some(DataType::TinyInt(None))
Some(DataType::BigInt(None))
);
assert_eq!(
get_data_type_by_alias_name("int4"),
Some(DataType::Int(None))
);
assert_eq!(
get_data_type_by_alias_name("int2"),
Some(DataType::SmallInt(None))
);
assert_eq!(
get_data_type_by_alias_name("INT16"),
@@ -394,11 +422,15 @@ CREATE TABLE data_types (
tt tinytext,
mt mediumtext,
lt longtext,
tint int8,
i2 int2,
i4 int4,
i8 int8,
sint int16,
i int32,
bint int64,
v varchar,
f4 float4,
f8 float8,
f float32,
d float64,
b boolean,
@@ -423,11 +455,15 @@ CREATE TABLE data_types (
tt TINYTEXT,
mt MEDIUMTEXT,
lt LONGTEXT,
tint TINYINT,
i2 SMALLINT,
i4 INT,
i8 BIGINT,
sint SMALLINT,
i INT,
bint BIGINT,
v VARCHAR,
f4 FLOAT,
f8 DOUBLE,
f FLOAT,
d DOUBLE,
b BOOLEAN,

View File

@@ -1,6 +1,14 @@
CREATE TABLE data_types (
s string,
tint int8,
i2 int2,
i4 int4,
i8 int8,
f4 float4,
f8 float8,
u64 uint64,
u32 uint32,
u16 uint16,
u8 uint8,
sint int16,
i INT32,
bint INT64,
@@ -26,7 +34,15 @@ SHOW CREATE TABLE data_types;
+------------+------------------------------------------------------------+
| data_types | CREATE TABLE IF NOT EXISTS "data_types" ( |
| | "s" STRING NULL, |
| | "tint" TINYINT NULL, |
| | "i2" SMALLINT NULL, |
| | "i4" INT NULL, |
| | "i8" BIGINT NULL, |
| | "f4" FLOAT NULL, |
| | "f8" DOUBLE NULL, |
| | "u64" BIGINT UNSIGNED NULL, |
| | "u32" INT UNSIGNED NULL, |
| | "u16" SMALLINT UNSIGNED NULL, |
| | "u8" TINYINT UNSIGNED NULL, |
| | "sint" SMALLINT NULL, |
| | "i" INT NULL, |
| | "bint" BIGINT NULL, |
@@ -55,7 +71,15 @@ DESC TABLE data_types;
| Column | Type | Key | Null | Default | Semantic Type |
+--------+----------------------+-----+------+---------------------+---------------+
| s | String | PRI | YES | | TAG |
| tint | Int8 | | YES | | FIELD |
| i2 | Int16 | | YES | | FIELD |
| i4 | Int32 | | YES | | FIELD |
| i8 | Int64 | | YES | | FIELD |
| f4 | Float32 | | YES | | FIELD |
| f8 | Float64 | | YES | | FIELD |
| u64 | UInt64 | | YES | | FIELD |
| u32 | UInt32 | | YES | | FIELD |
| u16 | UInt16 | | YES | | FIELD |
| u8 | UInt8 | | YES | | FIELD |
| sint | Int16 | | YES | | FIELD |
| i | Int32 | | YES | | FIELD |
| bint | Int64 | | YES | | FIELD |

View File

@@ -1,6 +1,14 @@
CREATE TABLE data_types (
s string,
tint int8,
i2 int2,
i4 int4,
i8 int8,
f4 float4,
f8 float8,
u64 uint64,
u32 uint32,
u16 uint16,
u8 uint8,
sint int16,
i INT32,
bint INT64,

View File

@@ -32,11 +32,11 @@ Error: 3001(EngineExecuteQuery), Cast error: Can't cast value -1 to type UInt8
SELECT h3_latlng_to_cell(37.76938, -122.3889, 8::Int8), h3_latlng_to_cell_string(37.76938, -122.3889, 8::Int8);
+-------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+
| h3_latlng_to_cell(Float64(37.76938),Float64(-122.3889),arrow_cast(Int64(8),Utf8("Int8"))) | h3_latlng_to_cell_string(Float64(37.76938),Float64(-122.3889),arrow_cast(Int64(8),Utf8("Int8"))) |
+-------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+
| 613196570438926335 | 88283082e7fffff |
+-------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+
+--------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------+
| h3_latlng_to_cell(Float64(37.76938),Float64(-122.3889),arrow_cast(Int64(8),Utf8("Int64"))) | h3_latlng_to_cell_string(Float64(37.76938),Float64(-122.3889),arrow_cast(Int64(8),Utf8("Int64"))) |
+--------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------+
| 613196570438926335 | 88283082e7fffff |
+--------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------+
SELECT h3_latlng_to_cell(37.76938, -122.3889, 8::Int16), h3_latlng_to_cell_string(37.76938, -122.3889, 8::Int16);
@@ -248,11 +248,11 @@ Error: 3001(EngineExecuteQuery), Cast error: Can't cast value -1 to type UInt8
SELECT geohash(37.76938, -122.3889, 11::Int8);
+----------------------------------------------------------------------------------+
| geohash(Float64(37.76938),Float64(-122.3889),arrow_cast(Int64(11),Utf8("Int8"))) |
+----------------------------------------------------------------------------------+
| 9q8yygxneft |
+----------------------------------------------------------------------------------+
+-----------------------------------------------------------------------------------+
| geohash(Float64(37.76938),Float64(-122.3889),arrow_cast(Int64(11),Utf8("Int64"))) |
+-----------------------------------------------------------------------------------+
| 9q8yygxneft |
+-----------------------------------------------------------------------------------+
SELECT geohash(37.76938, -122.3889, 11::Int16);