@@ -27,7 +27,6 @@ use databend_common_expression::DataSchema;
2727use databend_common_expression:: DataSchemaRef ;
2828use databend_common_expression:: DataSchemaRefExt ;
2929use databend_common_expression:: RemoteExpr ;
30- use databend_common_expression:: conversion:: classify_conversion;
3130use databend_common_expression:: type_check:: check_cast;
3231use databend_common_expression:: type_check:: common_super_type;
3332use databend_common_expression:: types:: DataType ;
@@ -101,69 +100,6 @@ type MergedFieldsResult = (
101100 Vec < ( usize , ( bool , bool ) ) > ,
102101) ;
103102
104- /// Remove an integer-to-string round trip from an equality key when the other key is an integer.
105- ///
106- /// Mixed string/integer equality normally uses `Decimal(38, 5)` as the hash key. That coercion is
107- /// needed for arbitrary strings such as `"1.2"`, but it is unnecessary when the string is produced
108- /// directly from another integer. Keep the rewrite deliberately narrow: both integers must fit
109- /// losslessly in their normal common numeric type. In that case formatting and parsing the value
110- /// cannot change equality.
111- fn unwrap_integer_to_string_cast < ' a > (
112- integer_expr : & ScalarExpr ,
113- string_expr : & ' a ScalarExpr ,
114- ) -> Result < Option < & ' a ScalarExpr > > {
115- let ScalarExpr :: CastExpr ( cast) = string_expr else {
116- return Ok ( None ) ;
117- } ;
118- if cast. is_try || !matches ! ( cast. target_type. remove_nullable( ) , DataType :: String ) {
119- return Ok ( None ) ;
120- }
121-
122- let integer_type = integer_expr. data_type ( ) ;
123- let DataType :: Number ( integer_type) = integer_type. remove_nullable ( ) else {
124- return Ok ( None ) ;
125- } ;
126- if !integer_type. is_integer ( ) {
127- return Ok ( None ) ;
128- }
129-
130- let source_type = cast. argument . data_type ( ) ;
131- let DataType :: Number ( source_type) = source_type. remove_nullable ( ) else {
132- return Ok ( None ) ;
133- } ;
134- if !source_type. is_integer ( ) {
135- return Ok ( None ) ;
136- }
137-
138- let integer_type = DataType :: Number ( integer_type) ;
139- let source_type = DataType :: Number ( source_type) ;
140- let common_type = common_super_type (
141- integer_type. clone ( ) ,
142- source_type. clone ( ) ,
143- & BUILTIN_FUNCTIONS . default_cast_rules ,
144- ) ;
145- let Some ( common_type @ DataType :: Number ( _) ) = common_type else {
146- return Ok ( None ) ;
147- } ;
148- let preserves_equality = classify_conversion ( & integer_type, & common_type)
149- . is_safe_for_equality_inference ( )
150- && classify_conversion ( & source_type, & common_type) . is_safe_for_equality_inference ( ) ;
151- Ok ( preserves_equality. then_some ( cast. argument . as_ref ( ) ) )
152- }
153-
154- fn simplify_integer_string_join_keys < ' a > (
155- left : & ' a ScalarExpr ,
156- right : & ' a ScalarExpr ,
157- ) -> Result < ( & ' a ScalarExpr , & ' a ScalarExpr ) > {
158- if let Some ( right) = unwrap_integer_to_string_cast ( left, right) ? {
159- return Ok ( ( left, right) ) ;
160- }
161- if let Some ( left) = unwrap_integer_to_string_cast ( right, left) ? {
162- return Ok ( ( left, right) ) ;
163- }
164- Ok ( ( left, right) )
165- }
166-
167103#[ derive( Clone , Debug , serde:: Serialize , serde:: Deserialize ) ]
168104pub struct NestedLoopFilterInfo {
169105 pub predicates : Vec < RemoteExpr > ,
@@ -875,10 +811,7 @@ impl PhysicalPlanBuilder {
875811 for condition in join. equi_conditions . iter ( ) {
876812 let original_left_condition = & condition. left ;
877813 let original_right_condition = & condition. right ;
878- let ( left_condition, right_condition) = simplify_integer_string_join_keys (
879- original_left_condition,
880- original_right_condition,
881- ) ?;
814+ let ( left_condition, right_condition) = condition. canonical_keys ( ) ;
882815
883816 // Type check expressions
884817 let right_expr = right_condition
@@ -1569,7 +1502,8 @@ mod tests {
15691502 let string_source = typed_column ( 1 , DataType :: Number ( NumberDataType :: Int32 ) ) ;
15701503 let string = cast_to_string ( string_source. clone ( ) ) ;
15711504
1572- let ( left, right) = simplify_integer_string_join_keys ( & integer, & string) ?;
1505+ let condition = JoinEquiCondition :: new ( integer. clone ( ) , string, false ) ;
1506+ let ( left, right) = condition. canonical_keys ( ) ;
15731507
15741508 assert_eq ! ( left, & integer) ;
15751509 assert_eq ! ( right, & string_source) ;
@@ -1582,7 +1516,8 @@ mod tests {
15821516 let string = cast_to_string ( string_source. clone ( ) ) ;
15831517 let integer = typed_column ( 1 , DataType :: Number ( NumberDataType :: Int64 ) ) ;
15841518
1585- let ( left, right) = simplify_integer_string_join_keys ( & string, & integer) ?;
1519+ let condition = JoinEquiCondition :: new ( string, integer. clone ( ) , false ) ;
1520+ let ( left, right) = condition. canonical_keys ( ) ;
15861521
15871522 assert_eq ! ( left, & string_source) ;
15881523 assert_eq ! ( right, & integer) ;
@@ -1601,7 +1536,8 @@ mod tests {
16011536 false ,
16021537 ) ;
16031538
1604- let ( left, right) = simplify_integer_string_join_keys ( & integer, & string) ?;
1539+ let condition = JoinEquiCondition :: new ( integer. clone ( ) , string, false ) ;
1540+ let ( left, right) = condition. canonical_keys ( ) ;
16051541
16061542 assert_eq ! ( left, & integer) ;
16071543 assert_eq ! ( right, & string_source) ;
@@ -1614,12 +1550,12 @@ mod tests {
16141550 let source = typed_column ( 1 , DataType :: Number ( NumberDataType :: Int32 ) ) ;
16151551 let try_cast = cast ( source, DataType :: String , true ) ;
16161552
1617- let simplified = simplify_integer_string_join_keys ( & integer, & try_cast) ? ;
1618- assert_eq ! ( simplified , ( & integer, & try_cast) ) ;
1553+ let condition = JoinEquiCondition :: new ( integer. clone ( ) , try_cast. clone ( ) , false ) ;
1554+ assert_eq ! ( condition . canonical_keys ( ) , ( & integer, & try_cast) ) ;
16191555
16201556 let string_column = typed_column ( 1 , DataType :: String ) ;
1621- let simplified = simplify_integer_string_join_keys ( & integer, & string_column) ? ;
1622- assert_eq ! ( simplified , ( & integer, & string_column) ) ;
1557+ let condition = JoinEquiCondition :: new ( integer. clone ( ) , string_column. clone ( ) , false ) ;
1558+ assert_eq ! ( condition . canonical_keys ( ) , ( & integer, & string_column) ) ;
16231559 Ok ( ( ) )
16241560 }
16251561
@@ -1635,14 +1571,14 @@ mod tests {
16351571
16361572 for ( index, source_type) in source_types. into_iter ( ) . enumerate ( ) {
16371573 let string = cast_to_string ( typed_column ( index + 1 , source_type) ) ;
1638- let simplified = simplify_integer_string_join_keys ( & integer, & string) ? ;
1639- assert_eq ! ( simplified , ( & integer, & string) ) ;
1574+ let condition = JoinEquiCondition :: new ( integer. clone ( ) , string. clone ( ) , false ) ;
1575+ assert_eq ! ( condition . canonical_keys ( ) , ( & integer, & string) ) ;
16401576 }
16411577
16421578 let float = typed_column ( 1 , DataType :: Number ( NumberDataType :: Float64 ) ) ;
16431579 let string = cast_to_string ( typed_column ( 2 , DataType :: Number ( NumberDataType :: Int32 ) ) ) ;
1644- let simplified = simplify_integer_string_join_keys ( & float, & string) ? ;
1645- assert_eq ! ( simplified , ( & float, & string) ) ;
1580+ let condition = JoinEquiCondition :: new ( float. clone ( ) , string. clone ( ) , false ) ;
1581+ assert_eq ! ( condition . canonical_keys ( ) , ( & float, & string) ) ;
16461582 Ok ( ( ) )
16471583 }
16481584
@@ -1651,9 +1587,8 @@ mod tests {
16511587 let integer = typed_column ( 0 , DataType :: Number ( NumberDataType :: Int64 ) ) ;
16521588 let string = cast_to_string ( typed_column ( 1 , DataType :: Number ( NumberDataType :: UInt64 ) ) ) ;
16531589
1654- let simplified = simplify_integer_string_join_keys ( & integer, & string) ?;
1655-
1656- assert_eq ! ( simplified, ( & integer, & string) ) ;
1590+ let condition = JoinEquiCondition :: new ( integer. clone ( ) , string. clone ( ) , false ) ;
1591+ assert_eq ! ( condition. canonical_keys( ) , ( & integer, & string) ) ;
16571592 Ok ( ( ) )
16581593 }
16591594}
0 commit comments