diff --git a/ballista/rust/core/Cargo.toml b/ballista/rust/core/Cargo.toml index 5d5a3ab77fb6..800ed53be0db 100644 --- a/ballista/rust/core/Cargo.toml +++ b/ballista/rust/core/Cargo.toml @@ -34,7 +34,7 @@ simd = ["datafusion/simd"] [dependencies] ahash = { version = "0.7", default-features = false } -arrow-flight = { version = "11" } +arrow-flight = { version = "11.1" } async-trait = "0.1.41" chrono = { version = "0.4", default-features = false } clap = { version = "3", features = ["derive", "cargo"] } diff --git a/ballista/rust/executor/Cargo.toml b/ballista/rust/executor/Cargo.toml index 69326352f43a..9ee793b7bfac 100644 --- a/ballista/rust/executor/Cargo.toml +++ b/ballista/rust/executor/Cargo.toml @@ -33,8 +33,8 @@ snmalloc = ["snmalloc-rs"] [dependencies] anyhow = "1" -arrow = { version = "11" } -arrow-flight = { version = "11" } +arrow = { version = "11.1" } +arrow-flight = { version = "11.1" } async-trait = "0.1.41" ballista-core = { path = "../core", version = "0.6.0" } chrono = { version = "0.4", default-features = false } diff --git a/datafusion-cli/Cargo.lock b/datafusion-cli/Cargo.lock index f334af5fab91..0263c275bf68 100644 --- a/datafusion-cli/Cargo.lock +++ b/datafusion-cli/Cargo.lock @@ -63,9 +63,9 @@ checksum = "8da52d66c7071e2e3fa2a1e5c6d088fec47b593032b254f5e980de8ea54454d6" [[package]] name = "arrow" -version = "11.0.0" +version = "11.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db922bcac0aa9f3b6e191d73b0b5df925c2c10ab4893f7416359f289e5d23489" +checksum = "3e4a0aa844fa9e1933504b4cd10e776167f370b746d0a622f32696d8d3b252e7" dependencies = [ "bitflags", "chrono", @@ -88,9 +88,9 @@ dependencies = [ [[package]] name = "arrow-flight" -version = "11.0.0" +version = "11.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2031e8b2b68eee8f7e1187cbc9c6eb9e3d09c48d937aa3a82e446db30a5f545d" +checksum = "6538896d203d3f159be25a66279960a3cccfc24381447d06ac9240d5f60dd51a" dependencies = [ "arrow", "base64", @@ -239,9 +239,9 @@ dependencies = [ [[package]] name = "brotli" -version = "3.3.3" +version = "3.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f838e47a451d5a8fa552371f80024dd6ace9b7acdf25c4c3d0f9bc6816fb1c39" +checksum = "a1a0b1dbcc8ae29329621f8d4f0d835787c1c38bb1401979b49d13b0b305ff68" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -311,9 +311,9 @@ dependencies = [ [[package]] name = "clap" -version = "3.1.6" +version = "3.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8c93436c21e4698bacadf42917db28b23017027a4deccb35dbe47a7e7840123" +checksum = "71c47df61d9e16dc010b55dba1952a57d8c215dbb533fd13cdd13369aac73b1c" dependencies = [ "atty", "bitflags", @@ -328,9 +328,9 @@ dependencies = [ [[package]] name = "clap_derive" -version = "3.1.4" +version = "3.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da95d038ede1a964ce99f49cbe27a7fb538d1da595e4b4f70b8c8f338d17bf16" +checksum = "a3aab4734e083b809aaf5794e14e756d1c798d2c69c7f7de7a09a2f5214993c1" dependencies = [ "heck 0.4.0", "proc-macro-error", @@ -801,9 +801,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.3.12" +version = "0.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62eeb471aa3e3c9197aa4bfeabfe02982f6dc96f750486c0bb0009ac58b26d2b" +checksum = "37a82c6d637fc9515a4694bbf1cb2457b79d81ce52b3108bdeea58b07dd34a57" dependencies = [ "bytes", "fnv", @@ -814,7 +814,7 @@ dependencies = [ "indexmap", "slab", "tokio", - "tokio-util 0.6.9", + "tokio-util 0.7.1", "tracing", ] @@ -947,9 +947,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "1.8.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "282a6247722caba404c065016bbfa522806e51714c34f5dfc3e4a3a46fcb4223" +checksum = "0f647032dfaa1f8b6dc29bd3edb7bbef4861b8b8007ebb118d6db284fd59f6ee" dependencies = [ "autocfg", "hashbrown 0.11.2", @@ -1099,10 +1099,11 @@ checksum = "5284f00d480e1c39af34e72f8ad60b94f47007e3481cd3b731c1d67190ddc7b7" [[package]] name = "lock_api" -version = "0.4.6" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88943dd7ef4a2e5a4bfa2753aaab3013e34ce2533d1996fb18ef591e315e2b3b" +checksum = "327fa5b6a6940e4699ec49a9beae1ea4845c6bab9314e4f84ac68742139d8c53" dependencies = [ + "autocfg", "scopeguard", ] @@ -1389,22 +1390,22 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.1" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28141e0cc4143da2443301914478dc976a61ffdb3f043058310c70df2fed8954" +checksum = "995f667a6c822200b0433ac218e05582f0e2efa1b922a3fd2fbaadc5f87bab37" dependencies = [ "cfg-if", "libc", "redox_syscall", "smallvec", - "windows-sys 0.32.0", + "windows-sys 0.34.0", ] [[package]] name = "parquet" -version = "11.0.0" +version = "11.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1460c04ede29e7a2d825357cd764c403b5d28ebdabc129876552c8a86a4ee9a8" +checksum = "9e2ba225e8c800adda2da6b0d63a65abf71867868682947ccb8fc6a9c68ba541" dependencies = [ "arrow", "base64", @@ -1634,18 +1635,18 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.2.12" +version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ae183fc1b06c149f0c1793e1eb447c8b04bfe46d48e9e48bfb8d2d7ed64ecf0" +checksum = "62f25bc4c7e55e0b0b7a1d43fb893f4fa1361d0abe38b9ce4f323c2adfe6ef42" dependencies = [ "bitflags", ] [[package]] name = "redox_users" -version = "0.4.2" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7776223e2696f1aa4c6b0170e83212f47296a00424305117d013dfe86fb0fe55" +checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" dependencies = [ "getrandom", "redox_syscall", @@ -1686,9 +1687,9 @@ dependencies = [ [[package]] name = "rustix" -version = "0.34.1" +version = "0.34.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd3cc851a13d30a34cb747ba2a0c5101a4b2e8b1677a29b213ee465365ea495e" +checksum = "96619609a54d638872db136f56941d34e2a00bb0acf3fa783a90d6b96a093ba2" dependencies = [ "bitflags", "errno", @@ -1785,9 +1786,9 @@ dependencies = [ [[package]] name = "slab" -version = "0.4.5" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9def91fd1e018fe007022791f865d0ccc9b3a0d5001e01aabb8b40e46000afb5" +checksum = "eb703cfe953bccee95685111adeedb76fabe4e97549a58d16f03ea7b9367bb32" [[package]] name = "smallvec" @@ -1813,9 +1814,9 @@ dependencies = [ [[package]] name = "sqlparser" -version = "0.15.0" +version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adbbea2526ad0d02ad9414a07c396078a5b944bbf9ca4fbab8f01bb4cb579081" +checksum = "7e9a527b68048eb95495a1508f6c8395c8defcff5ecdbe8ad4106d08a2ef2a3c" dependencies = [ "log", ] @@ -2020,6 +2021,7 @@ dependencies = [ "futures-sink", "pin-project-lite", "tokio", + "tracing", ] [[package]] @@ -2123,9 +2125,9 @@ dependencies = [ [[package]] name = "tracing-core" -version = "0.1.23" +version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa31669fa42c09c34d94d8165dd2012e8ff3c66aca50f3bb226b68f216f2706c" +checksum = "90442985ee2f57c9e1b548ee72ae842f4a9a20e3f417cc38dbc5dc684d9bb4ee" dependencies = [ "lazy_static", ] @@ -2270,15 +2272,15 @@ dependencies = [ [[package]] name = "windows-sys" -version = "0.32.0" +version = "0.34.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3df6e476185f92a12c072be4a189a0210dcdcf512a1891d6dff9edb874deadc6" +checksum = "5acdd78cb4ba54c0045ac14f62d8f94a03d10047904ae2a40afa1e99d8f70825" dependencies = [ - "windows_aarch64_msvc 0.32.0", - "windows_i686_gnu 0.32.0", - "windows_i686_msvc 0.32.0", - "windows_x86_64_gnu 0.32.0", - "windows_x86_64_msvc 0.32.0", + "windows_aarch64_msvc 0.34.0", + "windows_i686_gnu 0.34.0", + "windows_i686_msvc 0.34.0", + "windows_x86_64_gnu 0.34.0", + "windows_x86_64_msvc 0.34.0", ] [[package]] @@ -2289,9 +2291,9 @@ checksum = "29277a4435d642f775f63c7d1faeb927adba532886ce0287bd985bffb16b6bca" [[package]] name = "windows_aarch64_msvc" -version = "0.32.0" +version = "0.34.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8e92753b1c443191654ec532f14c199742964a061be25d77d7a96f09db20bf5" +checksum = "17cffbe740121affb56fad0fc0e421804adf0ae00891205213b5cecd30db881d" [[package]] name = "windows_i686_gnu" @@ -2301,9 +2303,9 @@ checksum = "1145e1989da93956c68d1864f32fb97c8f561a8f89a5125f6a2b7ea75524e4b8" [[package]] name = "windows_i686_gnu" -version = "0.32.0" +version = "0.34.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a711c68811799e017b6038e0922cb27a5e2f43a2ddb609fe0b6f3eeda9de615" +checksum = "2564fde759adb79129d9b4f54be42b32c89970c18ebf93124ca8870a498688ed" [[package]] name = "windows_i686_msvc" @@ -2313,9 +2315,9 @@ checksum = "d4a09e3a0d4753b73019db171c1339cd4362c8c44baf1bcea336235e955954a6" [[package]] name = "windows_i686_msvc" -version = "0.32.0" +version = "0.34.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "146c11bb1a02615db74680b32a68e2d61f553cc24c4eb5b4ca10311740e44172" +checksum = "9cd9d32ba70453522332c14d38814bceeb747d80b3958676007acadd7e166956" [[package]] name = "windows_x86_64_gnu" @@ -2325,9 +2327,9 @@ checksum = "8ca64fcb0220d58db4c119e050e7af03c69e6f4f415ef69ec1773d9aab422d5a" [[package]] name = "windows_x86_64_gnu" -version = "0.32.0" +version = "0.34.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c912b12f7454c6620635bbff3450962753834be2a594819bd5e945af18ec64bc" +checksum = "cfce6deae227ee8d356d19effc141a509cc503dfd1f850622ec4b0f84428e1f4" [[package]] name = "windows_x86_64_msvc" @@ -2337,9 +2339,9 @@ checksum = "08cabc9f0066848fef4bc6a1c1668e6efce38b661d2aeec75d18d8617eebb5f1" [[package]] name = "windows_x86_64_msvc" -version = "0.32.0" +version = "0.34.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "504a2476202769977a040c6364301a3f65d0cc9e3fb08600b2bda150a0488316" +checksum = "d19538ccc21819d01deaf88d6a17eae6596a12e9aafdbb97916fb49896d89de9" [[package]] name = "zstd" diff --git a/datafusion-cli/Cargo.toml b/datafusion-cli/Cargo.toml index 03d394f61b88..3a9a97083353 100644 --- a/datafusion-cli/Cargo.toml +++ b/datafusion-cli/Cargo.toml @@ -28,7 +28,7 @@ repository = "https://github.com/apache/arrow-datafusion" rust-version = "1.59" [dependencies] -arrow = { version = "11" } +arrow = { version = "11.1" } ballista = { path = "../ballista/rust/client", version = "0.6.0", optional = true } clap = { version = "3", features = ["derive", "cargo"] } datafusion = { path = "../datafusion/core", version = "7.0.0" } diff --git a/datafusion-examples/Cargo.toml b/datafusion-examples/Cargo.toml index 02d3abef5833..8a9c2feb4e26 100644 --- a/datafusion-examples/Cargo.toml +++ b/datafusion-examples/Cargo.toml @@ -34,7 +34,7 @@ path = "examples/avro_sql.rs" required-features = ["datafusion/avro"] [dev-dependencies] -arrow-flight = { version = "11" } +arrow-flight = { version = "11.1" } async-trait = "0.1.41" datafusion = { path = "../datafusion/core" } futures = "0.3" diff --git a/datafusion/common/Cargo.toml b/datafusion/common/Cargo.toml index 8917b8257bad..4ac4e978e709 100644 --- a/datafusion/common/Cargo.toml +++ b/datafusion/common/Cargo.toml @@ -38,10 +38,10 @@ jit = ["cranelift-module"] pyarrow = ["pyo3"] [dependencies] -arrow = { version = "11", features = ["prettyprint"] } +arrow = { version = "11.1", features = ["prettyprint"] } avro-rs = { version = "0.13", features = ["snappy"], optional = true } cranelift-module = { version = "0.82.0", optional = true } ordered-float = "2.10" -parquet = { version = "11", features = ["arrow"], optional = true } +parquet = { version = "11.1", features = ["arrow"], optional = true } pyo3 = { version = "0.16", optional = true } sqlparser = "0.16" diff --git a/datafusion/core/Cargo.toml b/datafusion/core/Cargo.toml index 94ad25bc7dff..77d82cb46e41 100644 --- a/datafusion/core/Cargo.toml +++ b/datafusion/core/Cargo.toml @@ -55,7 +55,7 @@ unicode_expressions = ["datafusion-physical-expr/regex_expressions"] [dependencies] ahash = { version = "0.7", default-features = false } -arrow = { version = "11", features = ["prettyprint"] } +arrow = { version = "11.1", features = ["prettyprint"] } async-trait = "0.1.41" avro-rs = { version = "0.13", features = ["snappy"], optional = true } chrono = { version = "0.4", default-features = false } @@ -72,7 +72,7 @@ num-traits = { version = "0.2", optional = true } num_cpus = "1.13.0" ordered-float = "2.10" parking_lot = "0.12" -parquet = { version = "11", features = ["arrow"] } +parquet = { version = "11.1", features = ["arrow"] } paste = "^1.0" pin-project-lite= "^0.2.7" pyo3 = { version = "0.16", optional = true } diff --git a/datafusion/core/fuzz-utils/Cargo.toml b/datafusion/core/fuzz-utils/Cargo.toml index 20745867a0c8..65e36797a782 100644 --- a/datafusion/core/fuzz-utils/Cargo.toml +++ b/datafusion/core/fuzz-utils/Cargo.toml @@ -23,6 +23,6 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -arrow = { version = "11", features = ["prettyprint"] } +arrow = { version = "11.1", features = ["prettyprint"] } env_logger = "0.9.0" rand = "0.8" diff --git a/datafusion/expr/Cargo.toml b/datafusion/expr/Cargo.toml index f807d4e8cf90..33f51e38745d 100644 --- a/datafusion/expr/Cargo.toml +++ b/datafusion/expr/Cargo.toml @@ -36,6 +36,6 @@ path = "src/lib.rs" [dependencies] ahash = { version = "0.7", default-features = false } -arrow = { version = "11", features = ["prettyprint"] } +arrow = { version = "11.1", features = ["prettyprint"] } datafusion-common = { path = "../common", version = "7.0.0" } sqlparser = "0.16" diff --git a/datafusion/jit/Cargo.toml b/datafusion/jit/Cargo.toml index e539e2b1f30b..052f5d82e54c 100644 --- a/datafusion/jit/Cargo.toml +++ b/datafusion/jit/Cargo.toml @@ -36,7 +36,7 @@ path = "src/lib.rs" jit = [] [dependencies] -arrow = { version = "11" } +arrow = { version = "11.1" } cranelift = "0.82.0" cranelift-jit = "0.82.0" cranelift-module = "0.82.0" diff --git a/datafusion/physical-expr/Cargo.toml b/datafusion/physical-expr/Cargo.toml index 8f93c72a5b22..6c39a004951e 100644 --- a/datafusion/physical-expr/Cargo.toml +++ b/datafusion/physical-expr/Cargo.toml @@ -40,7 +40,7 @@ unicode_expressions = ["unicode-segmentation"] [dependencies] ahash = { version = "0.7", default-features = false } -arrow = { version = "11", features = ["prettyprint"] } +arrow = { version = "11.1", features = ["prettyprint"] } blake2 = { version = "^0.10.2", optional = true } blake3 = { version = "1.0", optional = true } chrono = { version = "0.4", default-features = false } diff --git a/datafusion/physical-expr/src/expressions/binary.rs b/datafusion/physical-expr/src/expressions/binary.rs index 6b40c8f5af83..c3fc216aa3c0 100644 --- a/datafusion/physical-expr/src/expressions/binary.rs +++ b/datafusion/physical-expr/src/expressions/binary.rs @@ -135,260 +135,192 @@ fn is_not_distinct_from_bool( // TODO move decimal kernels to to arrow-rs // https://github.com/apache/arrow-rs/issues/1200 -// TODO use iter added for for decimal array in -// https://github.com/apache/arrow-rs/issues/1083 +/// Creates an BooleanArray the same size as `left`, +/// applying `op` to all non-null elements of left +fn compare_decimal_scalar( + left: &DecimalArray, + right: i128, + op: F, +) -> Result +where + F: Fn(i128, i128) -> bool, +{ + Ok(left + .iter() + .map(|left| left.map(|left| op(left, right))) + .collect()) +} + +/// Creates an BooleanArray the same size as `left`, +/// by applying `op` to all non-null elements of left and right +fn compare_decimal( + left: &DecimalArray, + right: &DecimalArray, + op: F, +) -> Result +where + F: Fn(i128, i128) -> bool, +{ + Ok(left + .iter() + .zip(right.iter()) + .map(|(left, right)| { + if let (Some(left), Some(right)) = (left, right) { + Some(op(left, right)) + } else { + None + } + }) + .collect()) +} + pub(super) fn eq_decimal_scalar( left: &DecimalArray, right: i128, ) -> Result { - let mut bool_builder = BooleanBuilder::new(left.len()); - for i in 0..left.len() { - if left.is_null(i) { - bool_builder.append_null()?; - } else { - bool_builder.append_value(left.value(i) == right)?; - } - } - Ok(bool_builder.finish()) + compare_decimal_scalar(left, right, |left, right| left == right) } pub(super) fn eq_decimal( left: &DecimalArray, right: &DecimalArray, ) -> Result { - let mut bool_builder = BooleanBuilder::new(left.len()); - for i in 0..left.len() { - if left.is_null(i) || right.is_null(i) { - bool_builder.append_null()?; - } else { - bool_builder.append_value(left.value(i) == right.value(i))?; - } - } - Ok(bool_builder.finish()) + compare_decimal(left, right, |left, right| left == right) } fn neq_decimal_scalar(left: &DecimalArray, right: i128) -> Result { - let mut bool_builder = BooleanBuilder::new(left.len()); - for i in 0..left.len() { - if left.is_null(i) { - bool_builder.append_null()?; - } else { - bool_builder.append_value(left.value(i) != right)?; - } - } - Ok(bool_builder.finish()) + compare_decimal_scalar(left, right, |left, right| left != right) } fn neq_decimal(left: &DecimalArray, right: &DecimalArray) -> Result { - let mut bool_builder = BooleanBuilder::new(left.len()); - for i in 0..left.len() { - if left.is_null(i) || right.is_null(i) { - bool_builder.append_null()?; - } else { - bool_builder.append_value(left.value(i) != right.value(i))?; - } - } - Ok(bool_builder.finish()) + compare_decimal(left, right, |left, right| left != right) } fn lt_decimal_scalar(left: &DecimalArray, right: i128) -> Result { - let mut bool_builder = BooleanBuilder::new(left.len()); - for i in 0..left.len() { - if left.is_null(i) { - bool_builder.append_null()?; - } else { - bool_builder.append_value(left.value(i) < right)?; - } - } - Ok(bool_builder.finish()) + compare_decimal_scalar(left, right, |left, right| left < right) } fn lt_decimal(left: &DecimalArray, right: &DecimalArray) -> Result { - let mut bool_builder = BooleanBuilder::new(left.len()); - for i in 0..left.len() { - if left.is_null(i) || right.is_null(i) { - bool_builder.append_null()?; - } else { - bool_builder.append_value(left.value(i) < right.value(i))?; - } - } - Ok(bool_builder.finish()) + compare_decimal(left, right, |left, right| left < right) } fn lt_eq_decimal_scalar(left: &DecimalArray, right: i128) -> Result { - let mut bool_builder = BooleanBuilder::new(left.len()); - for i in 0..left.len() { - if left.is_null(i) { - bool_builder.append_null()?; - } else { - bool_builder.append_value(left.value(i) <= right)?; - } - } - Ok(bool_builder.finish()) + compare_decimal_scalar(left, right, |left, right| left <= right) } fn lt_eq_decimal(left: &DecimalArray, right: &DecimalArray) -> Result { - let mut bool_builder = BooleanBuilder::new(left.len()); - for i in 0..left.len() { - if left.is_null(i) || right.is_null(i) { - bool_builder.append_null()?; - } else { - bool_builder.append_value(left.value(i) <= right.value(i))?; - } - } - Ok(bool_builder.finish()) + compare_decimal(left, right, |left, right| left <= right) } fn gt_decimal_scalar(left: &DecimalArray, right: i128) -> Result { - let mut bool_builder = BooleanBuilder::new(left.len()); - for i in 0..left.len() { - if left.is_null(i) { - bool_builder.append_null()?; - } else { - bool_builder.append_value(left.value(i) > right)?; - } - } - Ok(bool_builder.finish()) + compare_decimal_scalar(left, right, |left, right| left > right) } fn gt_decimal(left: &DecimalArray, right: &DecimalArray) -> Result { - let mut bool_builder = BooleanBuilder::new(left.len()); - for i in 0..left.len() { - if left.is_null(i) || right.is_null(i) { - bool_builder.append_null()?; - } else { - bool_builder.append_value(left.value(i) > right.value(i))?; - } - } - Ok(bool_builder.finish()) + compare_decimal(left, right, |left, right| left > right) } fn gt_eq_decimal_scalar(left: &DecimalArray, right: i128) -> Result { - let mut bool_builder = BooleanBuilder::new(left.len()); - for i in 0..left.len() { - if left.is_null(i) { - bool_builder.append_null()?; - } else { - bool_builder.append_value(left.value(i) >= right)?; - } - } - Ok(bool_builder.finish()) + compare_decimal_scalar(left, right, |left, right| left >= right) } fn gt_eq_decimal(left: &DecimalArray, right: &DecimalArray) -> Result { - let mut bool_builder = BooleanBuilder::new(left.len()); - for i in 0..left.len() { - if left.is_null(i) || right.is_null(i) { - bool_builder.append_null()?; - } else { - bool_builder.append_value(left.value(i) >= right.value(i))?; - } - } - Ok(bool_builder.finish()) + compare_decimal(left, right, |left, right| left >= right) } fn is_distinct_from_decimal( left: &DecimalArray, right: &DecimalArray, ) -> Result { - let mut bool_builder = BooleanBuilder::new(left.len()); - for i in 0..left.len() { - match (left.is_null(i), right.is_null(i)) { - (true, true) => bool_builder.append_value(false)?, - (true, false) | (false, true) => bool_builder.append_value(true)?, - (_, _) => bool_builder.append_value(left.value(i) != right.value(i))?, - } - } - Ok(bool_builder.finish()) + Ok(left + .iter() + .zip(right.iter()) + .map(|(left, right)| match (left, right) { + (None, None) => Some(false), + (None, Some(_)) | (Some(_), None) => Some(true), + (Some(left), Some(right)) => Some(left != right), + }) + .collect()) } fn is_not_distinct_from_decimal( left: &DecimalArray, right: &DecimalArray, ) -> Result { - let mut bool_builder = BooleanBuilder::new(left.len()); - for i in 0..left.len() { - match (left.is_null(i), right.is_null(i)) { - (true, true) => bool_builder.append_value(true)?, - (true, false) | (false, true) => bool_builder.append_value(false)?, - (_, _) => bool_builder.append_value(left.value(i) == right.value(i))?, - } - } - Ok(bool_builder.finish()) + Ok(left + .iter() + .zip(right.iter()) + .map(|(left, right)| match (left, right) { + (None, None) => Some(true), + (None, Some(_)) | (Some(_), None) => Some(false), + (Some(left), Some(right)) => Some(left == right), + }) + .collect()) +} + +/// Creates an DecimalArray the same size as `left`, +/// by applying `op` to all non-null elements of left and right +fn arith_decimal( + left: &DecimalArray, + right: &DecimalArray, + op: F, +) -> Result +where + F: Fn(i128, i128) -> Result, +{ + left.iter() + .zip(right.iter()) + .map(|(left, right)| { + if let (Some(left), Some(right)) = (left, right) { + Some(op(left, right)).transpose() + } else { + Ok(None) + } + }) + .collect() } fn add_decimal(left: &DecimalArray, right: &DecimalArray) -> Result { - let mut decimal_builder = - DecimalBuilder::new(left.len(), left.precision(), left.scale()); - for i in 0..left.len() { - if left.is_null(i) || right.is_null(i) { - decimal_builder.append_null()?; - } else { - decimal_builder.append_value(left.value(i) + right.value(i))?; - } - } - Ok(decimal_builder.finish()) + let array = arith_decimal(left, right, |left, right| Ok(left + right))? + .with_precision_and_scale(left.precision(), left.scale())?; + Ok(array) } fn subtract_decimal(left: &DecimalArray, right: &DecimalArray) -> Result { - let mut decimal_builder = - DecimalBuilder::new(left.len(), left.precision(), left.scale()); - for i in 0..left.len() { - if left.is_null(i) || right.is_null(i) { - decimal_builder.append_null()?; - } else { - decimal_builder.append_value(left.value(i) - right.value(i))?; - } - } - Ok(decimal_builder.finish()) + let array = arith_decimal(left, right, |left, right| Ok(left - right))? + .with_precision_and_scale(left.precision(), left.scale())?; + Ok(array) } fn multiply_decimal(left: &DecimalArray, right: &DecimalArray) -> Result { - let mut decimal_builder = - DecimalBuilder::new(left.len(), left.precision(), left.scale()); let divide = 10_i128.pow(left.scale() as u32); - for i in 0..left.len() { - if left.is_null(i) || right.is_null(i) { - decimal_builder.append_null()?; - } else { - decimal_builder.append_value(left.value(i) * right.value(i) / divide)?; - } - } - Ok(decimal_builder.finish()) + let array = arith_decimal(left, right, |left, right| Ok(left * right / divide))? + .with_precision_and_scale(left.precision(), left.scale())?; + Ok(array) } fn divide_decimal(left: &DecimalArray, right: &DecimalArray) -> Result { - let mut decimal_builder = - DecimalBuilder::new(left.len(), left.precision(), left.scale()); let mul = 10_f64.powi(left.scale() as i32); - for i in 0..left.len() { - if left.is_null(i) || right.is_null(i) { - decimal_builder.append_null()?; - } else if right.value(i) == 0 { - return Err(DataFusionError::ArrowError(DivideByZero)); - } else { - let l_value = left.value(i) as f64; - let r_value = right.value(i) as f64; - let result = ((l_value / r_value) * mul) as i128; - decimal_builder.append_value(result)?; - } - } - Ok(decimal_builder.finish()) + let array = arith_decimal(left, right, |left, right| { + let l_value = left as f64; + let r_value = right as f64; + let result = ((l_value / r_value) * mul) as i128; + Ok(result) + })? + .with_precision_and_scale(left.precision(), left.scale())?; + Ok(array) } fn modulus_decimal(left: &DecimalArray, right: &DecimalArray) -> Result { - let mut decimal_builder = - DecimalBuilder::new(left.len(), left.precision(), left.scale()); - for i in 0..left.len() { - if left.is_null(i) || right.is_null(i) { - decimal_builder.append_null()?; - } else if right.value(i) == 0 { - return Err(DataFusionError::ArrowError(DivideByZero)); + let array = arith_decimal(left, right, |left, right| { + if right == 0 { + Err(DataFusionError::ArrowError(DivideByZero)) } else { - decimal_builder.append_value(left.value(i) % right.value(i))?; + Ok(left % right) } - } - Ok(decimal_builder.finish()) + })? + .with_precision_and_scale(left.precision(), left.scale())?; + Ok(array) } /// The binary_bitwise_array_op macro only evaluates for integer types