This is an automated email from the ASF dual-hosted git repository.

alamb pushed a commit to branch string-view
in repository https://gitbox.apache.org/repos/asf/datafusion.git


The following commit(s) were added to refs/heads/string-view by this push:
     new 19ed182918 Implement support for LargeString and LargeBinary for 
StringView and BinaryView (#11034)
19ed182918 is described below

commit 19ed182918b102bf0b67b59e3359adae85839a01
Author: Xiangpeng Hao <[email protected]>
AuthorDate: Fri Jun 21 12:18:33 2024 -0400

    Implement support for LargeString and LargeBinary for StringView and 
BinaryView (#11034)
    
    * implement large binary
    
    * add tests for large string
    
    * better comments for string coercion
---
 datafusion/expr/src/type_coercion/binary.rs        | 36 ++++++++++------
 datafusion/sqllogictest/test_files/binary_view.slt | 48 ++++++++++++++++++++++
 datafusion/sqllogictest/test_files/string_view.slt | 47 +++++++++++++++++++++
 3 files changed, 119 insertions(+), 12 deletions(-)

diff --git a/datafusion/expr/src/type_coercion/binary.rs 
b/datafusion/expr/src/type_coercion/binary.rs
index 694e5e13f9..36100a0b72 100644
--- a/datafusion/expr/src/type_coercion/binary.rs
+++ b/datafusion/expr/src/type_coercion/binary.rs
@@ -922,17 +922,21 @@ fn string_concat_internal_coercion(
     }
 }
 
-/// Coercion rules for string types (Utf8/LargeUtf8): If at least one argument 
is
-/// a string type and both arguments can be coerced into a string type, coerce
-/// to string type.
+/// Coercion rules for string view types (Utf8/LargeUtf8/Utf8View):
+/// If at least one argument is a string view, we coerce to string view
+/// based on the observation that StringArray to StringViewArray is cheap but 
not vice versa.
+///
+/// Between Utf8 and LargeUtf8, we coerce to LargeUtf8.
 fn string_coercion(lhs_type: &DataType, rhs_type: &DataType) -> 
Option<DataType> {
     use arrow::datatypes::DataType::*;
     match (lhs_type, rhs_type) {
+        // If Utf8View is in any side, we coerce to Utf8View.
+        (Utf8View, Utf8View | Utf8 | LargeUtf8) | (Utf8 | LargeUtf8, Utf8View) 
=> {
+            Some(Utf8View)
+        }
+        // Then, if LargeUtf8 is in any side, we coerce to LargeUtf8.
+        (LargeUtf8, Utf8 | LargeUtf8) | (Utf8, LargeUtf8) => Some(LargeUtf8),
         (Utf8, Utf8) => Some(Utf8),
-        (LargeUtf8, Utf8) => Some(LargeUtf8),
-        (Utf8, LargeUtf8) => Some(LargeUtf8),
-        (LargeUtf8, LargeUtf8) => Some(LargeUtf8),
-        (Utf8View, Utf8View) | (Utf8View, Utf8) | (Utf8, Utf8View) => 
Some(Utf8View),
         _ => None,
     }
 }
@@ -982,18 +986,26 @@ fn binary_to_string_coercion(
     }
 }
 
-/// Coercion rules for binary types (Binary/LargeBinary): If at least one 
argument is
+/// Coercion rules for binary types (Binary/LargeBinary/BinaryView): If at 
least one argument is
 /// a binary type and both arguments can be coerced into a binary type, coerce
 /// to binary type.
 fn binary_coercion(lhs_type: &DataType, rhs_type: &DataType) -> 
Option<DataType> {
     use arrow::datatypes::DataType::*;
     match (lhs_type, rhs_type) {
-        (Binary | Utf8, Binary) | (Binary, Utf8) => Some(Binary),
-        (LargeBinary | Binary | Utf8 | LargeUtf8, LargeBinary)
-        | (LargeBinary, Binary | Utf8 | LargeUtf8) => Some(LargeBinary),
-        (BinaryView, BinaryView) | (BinaryView, Binary) | (Binary, BinaryView) 
=> {
+        // If BinaryView is in any side, we coerce to BinaryView.
+        (BinaryView, BinaryView | Binary | LargeBinary | Utf8 | LargeUtf8 | 
Utf8View)
+        | (LargeBinary | Binary | Utf8 | LargeUtf8 | Utf8View, BinaryView) => {
             Some(BinaryView)
         }
+        // Prefer LargeBinary over Binary
+        (LargeBinary | Binary | Utf8 | LargeUtf8 | Utf8View, LargeBinary)
+        | (LargeBinary, Binary | Utf8 | LargeUtf8 | Utf8View) => 
Some(LargeBinary),
+
+        // If Utf8View/LargeUtf8 presents need to be large Binary
+        (Utf8View | LargeUtf8, Binary) | (Binary, Utf8View | LargeUtf8) => {
+            Some(LargeBinary)
+        }
+        (Binary, Utf8) | (Utf8, Binary) => Some(Binary),
         _ => None,
     }
 }
diff --git a/datafusion/sqllogictest/test_files/binary_view.slt 
b/datafusion/sqllogictest/test_files/binary_view.slt
index 2728d4803c..de0f0bea7f 100644
--- a/datafusion/sqllogictest/test_files/binary_view.slt
+++ b/datafusion/sqllogictest/test_files/binary_view.slt
@@ -35,6 +35,8 @@ SELECT
   arrow_cast(column2, 'Utf8') as column2_utf8,
   arrow_cast(column1, 'Binary') AS column1_binary,
   arrow_cast(column2, 'Binary') AS column2_binary,
+  arrow_cast(column1, 'LargeBinary') AS column1_large_binary,
+  arrow_cast(column2, 'LargeBinary') AS column2_large_binary,
   arrow_cast(arrow_cast(column1, 'Binary'), 'BinaryView') AS 
column1_binaryview,
   arrow_cast(arrow_cast(column2, 'Binary'), 'BinaryView') AS 
column2_binaryview,
   arrow_cast(column1, 'Dictionary(Int32, Binary)') AS column1_dict,
@@ -120,6 +122,21 @@ Xiangpeng Xiangpeng true true false false
 Raphael R false false true true
 NULL R NULL NULL NULL NULL
 
+# test BinaryViewArray with LargeBinary columns
+query TTBBBB
+select
+  column1_utf8, column2_utf8,
+  column1_binaryview  = column2_large_binary,
+  column2_large_binary      = column1_binaryview,
+  column1_binaryview <> column2_large_binary,
+  column2_large_binary     <> column1_binaryview
+from test;
+----
+Andrew X false false true true
+Xiangpeng Xiangpeng true true false false
+Raphael R false false true true
+NULL R NULL NULL NULL NULL
+
 # BinaryView column to Binary scalar
 query TTBBBB
 select
@@ -135,6 +152,21 @@ Xiangpeng Xiangpeng false false true true
 Raphael R false false true true
 NULL R NULL NULL NULL NULL
 
+# BinaryView column to LargeBinary scalar
+query TTBBBB
+select
+  column1_utf8, column2_utf8,
+  column1_binaryview                 = arrow_cast('Andrew', 'LargeBinary'),
+  arrow_cast('Andrew', 'LargeBinary')     = column1_binaryview,
+  column1_binaryview                <> arrow_cast('Andrew', 'LargeBinary'),
+  arrow_cast('Andrew', 'LargeBinary')     <> column1_binaryview
+from test;
+----
+Andrew X true true false false
+Xiangpeng Xiangpeng false false true true
+Raphael R false false true true
+NULL R NULL NULL NULL NULL
+
 # Binary column to BinaryView scalar
 query TTBBBB
 select
@@ -150,5 +182,21 @@ Xiangpeng Xiangpeng false false true true
 Raphael R false false true true
 NULL R NULL NULL NULL NULL
 
+
+# LargeBinary column to BinaryView scalar
+query TTBBBB
+select
+  column1_utf8, column2_utf8,
+  column1_large_binary                     = arrow_cast(arrow_cast('Andrew', 
'Binary'), 'BinaryView'),
+  arrow_cast(arrow_cast('Andrew', 'Binary'), 'BinaryView') = 
column1_large_binary,
+  column1_large_binary                     <> arrow_cast(arrow_cast('Andrew', 
'Binary'), 'BinaryView'),
+  arrow_cast(arrow_cast('Andrew', 'Binary'), 'BinaryView') <> 
column1_large_binary
+from test;
+----
+Andrew X true true false false
+Xiangpeng Xiangpeng false false true true
+Raphael R false false true true
+NULL R NULL NULL NULL NULL
+
 statement ok
 drop table test;
\ No newline at end of file
diff --git a/datafusion/sqllogictest/test_files/string_view.slt 
b/datafusion/sqllogictest/test_files/string_view.slt
index f8824b23d1..7c9fbf4735 100644
--- a/datafusion/sqllogictest/test_files/string_view.slt
+++ b/datafusion/sqllogictest/test_files/string_view.slt
@@ -33,6 +33,8 @@ create table test as
 SELECT
   arrow_cast(column1, 'Utf8') as column1_utf8,
   arrow_cast(column2, 'Utf8') as column2_utf8,
+  arrow_cast(column1, 'LargeUtf8') as column1_large_utf8,
+  arrow_cast(column2, 'LargeUtf8') as column2_large_utf8,
   arrow_cast(column1, 'Utf8View') as column1_utf8view,
   arrow_cast(column2, 'Utf8View') as column2_utf8view,
   arrow_cast(column1, 'Dictionary(Int32, Utf8)') as column1_dict,
@@ -118,6 +120,22 @@ Xiangpeng Xiangpeng true true false false
 Raphael R false false true true
 NULL R NULL NULL NULL NULL
 
+# test StringViewArray with LargeUtf8 columns
+query TTBBBB
+select
+  column1_utf8, column2_utf8,
+  column1_utf8view  = column2_large_utf8,
+  column2_large_utf8      = column1_utf8view,
+  column1_utf8view <> column2_large_utf8,
+  column2_large_utf8     <> column1_utf8view
+from test;
+----
+Andrew X false false true true
+Xiangpeng Xiangpeng true true false false
+Raphael R false false true true
+NULL R NULL NULL NULL NULL
+
+
 # StringView column to String scalar
 query TTBBBB
 select
@@ -133,6 +151,21 @@ Xiangpeng Xiangpeng false false true true
 Raphael R false false true true
 NULL R NULL NULL NULL NULL
 
+# StringView column to LargeString scalar
+query TTBBBB
+select
+  column1_utf8, column2_utf8,
+  column1_utf8view                 = arrow_cast('Andrew', 'LargeUtf8'),
+  arrow_cast('Andrew', 'LargeUtf8')     = column1_utf8view,
+  column1_utf8view                 <> arrow_cast('Andrew', 'LargeUtf8'),
+  arrow_cast('Andrew', 'LargeUtf8')     <> column1_utf8view
+from test;
+----
+Andrew X true true false false
+Xiangpeng Xiangpeng false false true true
+Raphael R false false true true
+NULL R NULL NULL NULL NULL
+
 # String column to StringView scalar
 query TTBBBB
 select
@@ -148,6 +181,20 @@ Xiangpeng Xiangpeng false false true true
 Raphael R false false true true
 NULL R NULL NULL NULL NULL
 
+# LargeString column to StringView scalar
+query TTBBBB
+select
+  column1_utf8, column2_utf8,
+  column1_large_utf8                     = arrow_cast('Andrew', 'Utf8View'),
+  arrow_cast('Andrew', 'Utf8View') = column1_large_utf8,
+  column1_large_utf8                    <> arrow_cast('Andrew', 'Utf8View'),
+  arrow_cast('Andrew', 'Utf8View') <> column1_large_utf8
+from test;
+----
+Andrew X true true false false
+Xiangpeng Xiangpeng false false true true
+Raphael R false false true true
+NULL R NULL NULL NULL NULL
 
 ########
 ## StringView to Dictionary


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to