@@ -54,7 +54,7 @@ pub enum LogicalType {
5454 UBigint ,
5555 Float ,
5656 Double ,
57- Varchar ,
57+ Varchar ( Option < u32 > ) ,
5858 Date ,
5959 DateTime ,
6060}
@@ -75,7 +75,8 @@ impl LogicalType {
7575 LogicalType :: UBigint => Some ( 8 ) ,
7676 LogicalType :: Float => Some ( 4 ) ,
7777 LogicalType :: Double => Some ( 8 ) ,
78- LogicalType :: Varchar => None ,
78+ /// Note: The non-fixed length type's raw_len is None
79+ LogicalType :: Varchar ( _) =>None ,
7980 LogicalType :: Date => Some ( 4 ) ,
8081 LogicalType :: DateTime => Some ( 8 ) ,
8182 }
@@ -156,13 +157,13 @@ impl LogicalType {
156157 if left. is_numeric ( ) && right. is_numeric ( ) {
157158 return LogicalType :: combine_numeric_types ( left, right) ;
158159 }
159- if matches ! ( ( left, right) , ( LogicalType :: Date , LogicalType :: Varchar ) | ( LogicalType :: Varchar , LogicalType :: Date ) ) {
160+ if matches ! ( ( left, right) , ( LogicalType :: Date , LogicalType :: Varchar ( _ ) ) | ( LogicalType :: Varchar ( _ ) , LogicalType :: Date ) ) {
160161 return Ok ( LogicalType :: Date ) ;
161162 }
162163 if matches ! ( ( left, right) , ( LogicalType :: Date , LogicalType :: DateTime ) | ( LogicalType :: DateTime , LogicalType :: Date ) ) {
163164 return Ok ( LogicalType :: DateTime ) ;
164165 }
165- if matches ! ( ( left, right) , ( LogicalType :: DateTime , LogicalType :: Varchar ) | ( LogicalType :: Varchar , LogicalType :: DateTime ) ) {
166+ if matches ! ( ( left, right) , ( LogicalType :: DateTime , LogicalType :: Varchar ( _ ) ) | ( LogicalType :: Varchar ( _ ) , LogicalType :: DateTime ) ) {
166167 return Ok ( LogicalType :: DateTime ) ;
167168 }
168169 Err ( TypeError :: InternalError ( format ! (
@@ -265,9 +266,9 @@ impl LogicalType {
265266 LogicalType :: UBigint => matches ! ( to, LogicalType :: Float | LogicalType :: Double ) ,
266267 LogicalType :: Float => matches ! ( to, LogicalType :: Double ) ,
267268 LogicalType :: Double => false ,
268- LogicalType :: Varchar => false ,
269- LogicalType :: Date => matches ! ( to, LogicalType :: DateTime | LogicalType :: Varchar ) ,
270- LogicalType :: DateTime => matches ! ( to, LogicalType :: Date | LogicalType :: Varchar ) ,
269+ LogicalType :: Varchar ( _ ) => false ,
270+ LogicalType :: Date => matches ! ( to, LogicalType :: DateTime | LogicalType :: Varchar ( _ ) ) ,
271+ LogicalType :: DateTime => matches ! ( to, LogicalType :: Date | LogicalType :: Varchar ( _ ) ) ,
271272 }
272273 }
273274}
@@ -278,11 +279,8 @@ impl TryFrom<sqlparser::ast::DataType> for LogicalType {
278279
279280 fn try_from ( value : sqlparser:: ast:: DataType ) -> Result < Self , Self :: Error > {
280281 match value {
281- sqlparser:: ast:: DataType :: Char ( _)
282- | sqlparser:: ast:: DataType :: Varchar ( _)
283- | sqlparser:: ast:: DataType :: Nvarchar ( _)
284- | sqlparser:: ast:: DataType :: Text
285- | sqlparser:: ast:: DataType :: String => Ok ( LogicalType :: Varchar ) ,
282+ sqlparser:: ast:: DataType :: Char ( len)
283+ | sqlparser:: ast:: DataType :: Varchar ( len) => Ok ( LogicalType :: Varchar ( len. map ( |len| len. length as u32 ) ) ) ,
286284 sqlparser:: ast:: DataType :: Float ( _) => Ok ( LogicalType :: Float ) ,
287285 sqlparser:: ast:: DataType :: Double => Ok ( LogicalType :: Double ) ,
288286 sqlparser:: ast:: DataType :: TinyInt ( _) => Ok ( LogicalType :: Tinyint ) ,
@@ -315,7 +313,7 @@ impl std::fmt::Display for LogicalType {
315313mod test {
316314 use std:: sync:: atomic:: Ordering :: Release ;
317315
318- use crate :: types:: { IdGenerator , ID_BUF } ;
316+ use crate :: types:: { IdGenerator , ID_BUF , LogicalType } ;
319317
320318 /// Tips: 由于IdGenerator为static全局性质生成的id,因此需要单独测试避免其他测试方法干扰
321319 #[ test]
0 commit comments