Skip to content

Commit 89aa80e

Browse files
authored
fix(query): table field data type in show create table incorrect (#17112)
* fix show table * sql_name_explicit_null * fix * fix
1 parent 6eea9b4 commit 89aa80e

File tree

4 files changed

+132
-40
lines changed

4 files changed

+132
-40
lines changed

src/query/expression/src/schema.rs

Lines changed: 121 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1285,23 +1285,79 @@ impl TableDataType {
12851285
pub fn sql_name(&self) -> String {
12861286
match self {
12871287
TableDataType::Number(num_ty) => match num_ty {
1288-
NumberDataType::UInt8 => "TINYINT UNSIGNED".to_string(),
1289-
NumberDataType::UInt16 => "SMALLINT UNSIGNED".to_string(),
1290-
NumberDataType::UInt32 => "INT UNSIGNED".to_string(),
1291-
NumberDataType::UInt64 => "BIGINT UNSIGNED".to_string(),
1292-
NumberDataType::Int8 => "TINYINT".to_string(),
1293-
NumberDataType::Int16 => "SMALLINT".to_string(),
1294-
NumberDataType::Int32 => "INT".to_string(),
1295-
NumberDataType::Int64 => "BIGINT".to_string(),
1296-
NumberDataType::Float32 => "FLOAT".to_string(),
1297-
NumberDataType::Float64 => "DOUBLE".to_string(),
1298-
},
1288+
NumberDataType::UInt8 => "TINYINT UNSIGNED",
1289+
NumberDataType::UInt16 => "SMALLINT UNSIGNED",
1290+
NumberDataType::UInt32 => "INT UNSIGNED",
1291+
NumberDataType::UInt64 => "BIGINT UNSIGNED",
1292+
NumberDataType::Int8 => "TINYINT",
1293+
NumberDataType::Int16 => "SMALLINT",
1294+
NumberDataType::Int32 => "INT",
1295+
NumberDataType::Int64 => "BIGINT",
1296+
NumberDataType::Float32 => "FLOAT",
1297+
NumberDataType::Float64 => "DOUBLE",
1298+
}
1299+
.to_string(),
12991300
TableDataType::String => "VARCHAR".to_string(),
13001301
TableDataType::Nullable(inner_ty) => format!("{} NULL", inner_ty.sql_name()),
13011302
_ => self.to_string().to_uppercase(),
13021303
}
13031304
}
13041305

1306+
pub fn sql_name_explicit_null(&self) -> String {
1307+
fn name(ty: &TableDataType, is_null: bool) -> String {
1308+
let s = match ty {
1309+
TableDataType::Null => return "NULL".to_string(),
1310+
TableDataType::Nullable(inner_ty) => return name(inner_ty, true),
1311+
TableDataType::Array(inner) => {
1312+
format!("ARRAY({})", name(inner, false))
1313+
}
1314+
TableDataType::Map(inner) => match inner.as_ref() {
1315+
TableDataType::Tuple { fields_type, .. } => {
1316+
format!(
1317+
"MAP({}, {})",
1318+
name(&fields_type[0], false),
1319+
name(&fields_type[1], false)
1320+
)
1321+
}
1322+
_ => unreachable!(),
1323+
},
1324+
TableDataType::Tuple {
1325+
fields_name,
1326+
fields_type,
1327+
} => {
1328+
format!(
1329+
"TUPLE({})",
1330+
fields_name
1331+
.iter()
1332+
.zip(fields_type)
1333+
.map(|(n, ty)| format!("{n} {}", name(ty, false)))
1334+
.join(", ")
1335+
)
1336+
}
1337+
TableDataType::EmptyArray
1338+
| TableDataType::EmptyMap
1339+
| TableDataType::Number(_)
1340+
| TableDataType::String
1341+
| TableDataType::Boolean
1342+
| TableDataType::Binary
1343+
| TableDataType::Decimal(_)
1344+
| TableDataType::Timestamp
1345+
| TableDataType::Date
1346+
| TableDataType::Bitmap
1347+
| TableDataType::Variant
1348+
| TableDataType::Geometry
1349+
| TableDataType::Geography
1350+
| TableDataType::Interval => ty.sql_name(),
1351+
};
1352+
if is_null {
1353+
format!("{} NULL", s)
1354+
} else {
1355+
format!("{} NOT NULL", s)
1356+
}
1357+
}
1358+
name(self, false)
1359+
}
1360+
13051361
// Returns the number of leaf columns of the TableDataType
13061362
pub fn num_leaf_columns(&self) -> usize {
13071363
match self {
@@ -1535,3 +1591,57 @@ pub fn create_test_complex_schema() -> TableSchema {
15351591
field1, field2, field3, field4, field5, field6, field7, field8,
15361592
])
15371593
}
1594+
1595+
#[cfg(test)]
1596+
mod tests {
1597+
use super::*;
1598+
1599+
#[test]
1600+
fn test_sql_name_with_null() {
1601+
for (expected, data_type) in [
1602+
("NULL", TableDataType::Null),
1603+
(
1604+
"ARRAY(NOTHING) NULL",
1605+
TableDataType::EmptyArray.wrap_nullable(),
1606+
),
1607+
(
1608+
"BIGINT UNSIGNED NOT NULL",
1609+
TableDataType::Number(NumberDataType::UInt64),
1610+
),
1611+
(
1612+
"VARCHAR NULL",
1613+
TableDataType::Nullable(Box::new(TableDataType::String)),
1614+
),
1615+
(
1616+
"ARRAY(VARCHAR NOT NULL) NOT NULL",
1617+
TableDataType::Array(Box::new(TableDataType::String)),
1618+
),
1619+
(
1620+
"MAP(BIGINT UNSIGNED NOT NULL, VARCHAR NOT NULL) NOT NULL",
1621+
TableDataType::Map(Box::new(TableDataType::Tuple {
1622+
fields_name: vec!["key".to_string(), "value".to_string()],
1623+
fields_type: vec![
1624+
TableDataType::Number(NumberDataType::UInt64),
1625+
TableDataType::String,
1626+
],
1627+
})),
1628+
),
1629+
(
1630+
"TUPLE(a INT NULL, b INT NOT NULL) NOT NULL",
1631+
TableDataType::Tuple {
1632+
fields_name: vec!["a".to_string(), "b".to_string()],
1633+
fields_type: vec![
1634+
TableDataType::Nullable(
1635+
TableDataType::Number(NumberDataType::Int32).into(),
1636+
),
1637+
TableDataType::Number(NumberDataType::Int32),
1638+
],
1639+
},
1640+
),
1641+
]
1642+
.iter()
1643+
{
1644+
assert_eq!(expected, &&data_type.sql_name_explicit_null());
1645+
}
1646+
}
1647+
}

src/query/service/src/interpreters/interpreter_dictionary_show_create.rs

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -126,23 +126,15 @@ impl ShowCreateDictionaryInterpreter {
126126
{
127127
let mut create_defs = vec![];
128128
for field in schema.fields().iter() {
129-
let nullable = if field.is_nullable() {
130-
" NULL".to_string()
131-
} else {
132-
" NOT NULL".to_string()
133-
};
134129
// compatibility: creating table in the old planner will not have `fields_comments`
135130
let comment = field_comments
136131
.get(&field.column_id)
137132
.and_then(|c| format!(" COMMENT '{}'", c).into())
138133
.unwrap_or_default();
139-
let column_str = format!(
140-
" {} {}{}{}",
141-
display_ident(field.name(), quoted_ident_case_sensitive, sql_dialect),
142-
field.data_type().remove_recursive_nullable().sql_name(),
143-
nullable,
144-
comment
145-
);
134+
135+
let ident = display_ident(field.name(), quoted_ident_case_sensitive, sql_dialect);
136+
let data_type = field.data_type().sql_name_explicit_null();
137+
let column_str = format!(" {ident} {data_type}{comment}",);
146138

147139
create_defs.push(column_str);
148140
}

src/query/service/src/interpreters/interpreter_table_show_create.rs

Lines changed: 4 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -169,11 +169,6 @@ impl ShowCreateTableInterpreter {
169169
{
170170
let mut create_defs = vec![];
171171
for (idx, field) in schema.fields().iter().enumerate() {
172-
let nullable = if field.is_nullable() {
173-
" NULL".to_string()
174-
} else {
175-
" NOT NULL".to_string()
176-
};
177172
let default_expr = match field.default_expr() {
178173
Some(expr) => {
179174
format!(" DEFAULT {expr}")
@@ -201,15 +196,10 @@ impl ShowCreateTableInterpreter {
201196
} else {
202197
"".to_string()
203198
};
204-
let column_str = format!(
205-
" {} {}{}{}{}{}",
206-
display_ident(field.name(), quoted_ident_case_sensitive, sql_dialect),
207-
field.data_type().remove_recursive_nullable().sql_name(),
208-
nullable,
209-
default_expr,
210-
computed_expr,
211-
comment
212-
);
199+
let ident = display_ident(field.name(), quoted_ident_case_sensitive, sql_dialect);
200+
let data_type = field.data_type().sql_name_explicit_null();
201+
let column_str =
202+
format!(" {ident} {data_type}{default_expr}{computed_expr}{comment}");
213203

214204
create_defs.push(column_str);
215205
}

tests/sqllogictests/suites/base/05_ddl/05_0003_ddl_alter_table.test

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ INSERT INTO TABLE `05_0003_at_t4` values('a', 'b', ['c1', 'c2'], ('d1', 'd2'))
130130
query TT
131131
SHOW CREATE TABLE `05_0003_at_t4`
132132
----
133-
05_0003_at_t4 CREATE TABLE "05_0003_at_t4" ( a VARCHAR NOT NULL, b VARCHAR NULL, c ARRAY(STRING) NULL, d TUPLE(1 STRING, 2 STRING) NULL ) ENGINE=FUSE
133+
05_0003_at_t4 CREATE TABLE "05_0003_at_t4" ( a VARCHAR NOT NULL, b VARCHAR NULL, c ARRAY(VARCHAR NULL) NULL, d TUPLE(1 VARCHAR NULL, 2 VARCHAR NULL) NULL ) ENGINE=FUSE
134134

135135
query TTTT
136136
SELECT * FROM `05_0003_at_t4`
@@ -152,7 +152,7 @@ ALTER TABLE `05_0003_at_t4` MODIFY COLUMN d tuple(binary, binary) null
152152
query TT
153153
SHOW CREATE TABLE `05_0003_at_t4`
154154
----
155-
05_0003_at_t4 CREATE TABLE "05_0003_at_t4" ( a BINARY NOT NULL, b BINARY NULL, c ARRAY(BINARY) NULL, d TUPLE(1 BINARY, 2 BINARY) NULL ) ENGINE=FUSE
155+
05_0003_at_t4 CREATE TABLE "05_0003_at_t4" ( a BINARY NOT NULL, b BINARY NULL, c ARRAY(BINARY NULL) NULL, d TUPLE(1 BINARY NULL, 2 BINARY NULL) NULL ) ENGINE=FUSE
156156

157157
query
158158
SELECT * FROM `05_0003_at_t4`
@@ -174,7 +174,7 @@ ALTER TABLE `05_0003_at_t4` MODIFY COLUMN d tuple(string, string) null
174174
query TT
175175
SHOW CREATE TABLE `05_0003_at_t4`
176176
----
177-
05_0003_at_t4 CREATE TABLE "05_0003_at_t4" ( a VARCHAR NOT NULL, b VARCHAR NULL, c ARRAY(STRING) NULL, d TUPLE(1 STRING, 2 STRING) NULL ) ENGINE=FUSE
177+
05_0003_at_t4 CREATE TABLE "05_0003_at_t4" ( a VARCHAR NOT NULL, b VARCHAR NULL, c ARRAY(VARCHAR NULL) NULL, d TUPLE(1 VARCHAR NULL, 2 VARCHAR NULL) NULL ) ENGINE=FUSE
178178

179179
query TTTT
180180
SELECT * FROM `05_0003_at_t4`

0 commit comments

Comments
 (0)