@@ -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+ }
0 commit comments