Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Simplify InListExpr ~20-70% Faster #4057

Merged
merged 8 commits into from
Nov 2, 2022
Merged

Conversation

tustvold
Copy link
Contributor

@tustvold tustvold commented Nov 1, 2022

Which issue does this PR close?

Closes #2165
Closes #2831
Closes #2833

Rationale for this change

The existing logic is incredibly hard to follow. Additionally its use of ScalarValue results in additional allocations, and dynamic dispatch, which is likely severely hurting performance

Benchmarks in #4068, show a slight regression for single primitive value InList, but otherwise across the board a significant improvement. The regression is due to now always using a HashSet, but the additional complexity of two evaluation methods for this case did not seem worthwhile anymore, especially when the optimizer should really rewrite such expressions to a disjunctive boolean expression.

in_list_utf8(5) (1024, 0) IN (1, 0)
                        time:   [2.2167 µs 2.2172 µs 2.2178 µs]
                        change: [+15.641% +16.029% +16.432%] (p = 0.00 < 0.05)
                        Performance has regressed.
Found 9 outliers among 100 measurements (9.00%)
  8 (8.00%) high mild
  1 (1.00%) high severe

in_list_utf8(10) (1024, 0) IN (1, 0)
                        time:   [2.3520 µs 2.3531 µs 2.3544 µs]
                        change: [+16.658% +17.034% +17.347%] (p = 0.00 < 0.05)
                        Performance has regressed.
Found 12 outliers among 100 measurements (12.00%)
  2 (2.00%) low severe
  2 (2.00%) low mild
  4 (4.00%) high mild
  4 (4.00%) high severe

in_list_utf8(20) (1024, 0) IN (1, 0)
                        time:   [2.3043 µs 2.3046 µs 2.3049 µs]
                        change: [+12.943% +13.338% +13.746%] (p = 0.00 < 0.05)
                        Performance has regressed.
Found 10 outliers among 100 measurements (10.00%)
  3 (3.00%) low mild
  4 (4.00%) high mild
  3 (3.00%) high severe

in_list_f32 (1024, 0) IN (1, 0)
                        time:   [2.2534 µs 2.2536 µs 2.2539 µs]
                        change: [-4.1107% -3.7923% -3.4859%] (p = 0.00 < 0.05)
                        Performance has improved.
Found 8 outliers among 100 measurements (8.00%)
  6 (6.00%) high mild
  2 (2.00%) high severe

in_list_i32 (1024, 0) IN (1, 0)
                        time:   [2.0460 µs 2.0469 µs 2.0479 µs]
                        change: [-14.931% -14.636% -14.355%] (p = 0.00 < 0.05)
                        Performance has improved.
Found 12 outliers among 100 measurements (12.00%)
  6 (6.00%) low severe
  1 (1.00%) low mild
  2 (2.00%) high mild
  3 (3.00%) high severe

in_list_utf8(5) (1024, 0.2) IN (1, 0)
                        time:   [3.4523 µs 3.4535 µs 3.4548 µs]
                        change: [+18.506% +19.006% +19.550%] (p = 0.00 < 0.05)
                        Performance has regressed.
Found 8 outliers among 100 measurements (8.00%)
  2 (2.00%) high mild
  6 (6.00%) high severe

in_list_utf8(10) (1024, 0.2) IN (1, 0)
                        time:   [3.6981 µs 3.7001 µs 3.7025 µs]
                        change: [+29.569% +30.046% +30.510%] (p = 0.00 < 0.05)
                        Performance has regressed.
Found 7 outliers among 100 measurements (7.00%)
  4 (4.00%) high mild
  3 (3.00%) high severe

in_list_utf8(20) (1024, 0.2) IN (1, 0)
                        time:   [3.7997 µs 3.8030 µs 3.8064 µs]
                        change: [+33.015% +33.445% +33.938%] (p = 0.00 < 0.05)
                        Performance has regressed.
Found 15 outliers among 100 measurements (15.00%)
  6 (6.00%) low mild
  5 (5.00%) high mild
  4 (4.00%) high severe

in_list_f32 (1024, 0.2) IN (1, 0)
                        time:   [2.8673 µs 2.8721 µs 2.8768 µs]
                        change: [+4.8953% +5.3421% +5.7329%] (p = 0.00 < 0.05)
                        Performance has regressed.
Found 13 outliers among 100 measurements (13.00%)
  2 (2.00%) low mild
  7 (7.00%) high mild
  4 (4.00%) high severe

in_list_i32 (1024, 0.2) IN (1, 0)
                        time:   [2.6677 µs 2.6692 µs 2.6708 µs]
                        change: [+2.8867% +3.1880% +3.4532%] (p = 0.00 < 0.05)
                        Performance has regressed.
Found 6 outliers among 100 measurements (6.00%)
  4 (4.00%) high mild
  2 (2.00%) high severe

in_list_utf8(5) (1024, 0) IN (3, 0)
                        time:   [2.2539 µs 2.2544 µs 2.2549 µs]
                        change: [+10.541% +10.906% +11.253%] (p = 0.00 < 0.05)
                        Performance has regressed.
Found 7 outliers among 100 measurements (7.00%)
  1 (1.00%) low mild
  2 (2.00%) high mild
  4 (4.00%) high severe

in_list_utf8(10) (1024, 0) IN (3, 0)
                        time:   [2.3193 µs 2.3195 µs 2.3198 µs]
                        change: [+13.197% +13.593% +13.966%] (p = 0.00 < 0.05)
                        Performance has regressed.
Found 6 outliers among 100 measurements (6.00%)
  2 (2.00%) low mild
  1 (1.00%) high mild
  3 (3.00%) high severe

in_list_utf8(20) (1024, 0) IN (3, 0)
                        time:   [2.2470 µs 2.2472 µs 2.2475 µs]
                        change: [+10.062% +10.441% +10.832%] (p = 0.00 < 0.05)
                        Performance has regressed.
Found 7 outliers among 100 measurements (7.00%)
  1 (1.00%) low mild
  2 (2.00%) high mild
  4 (4.00%) high severe

in_list_f32 (1024, 0) IN (3, 0)
                        time:   [2.2680 µs 2.2683 µs 2.2688 µs]
                        change: [-6.5086% -6.2132% -5.9381%] (p = 0.00 < 0.05)
                        Performance has improved.
Found 9 outliers among 100 measurements (9.00%)
  5 (5.00%) high mild
  4 (4.00%) high severe

in_list_i32 (1024, 0) IN (3, 0)
                        time:   [2.0361 µs 2.0364 µs 2.0367 µs]
                        change: [-16.175% -15.844% -15.542%] (p = 0.00 < 0.05)
                        Performance has improved.
Found 5 outliers among 100 measurements (5.00%)
  1 (1.00%) low mild
  2 (2.00%) high mild
  2 (2.00%) high severe

in_list_utf8(5) (1024, 0.2) IN (3, 0)
                        time:   [3.7023 µs 3.7047 µs 3.7072 µs]
                        change: [-16.583% -16.274% -16.001%] (p = 0.00 < 0.05)
                        Performance has improved.
Found 14 outliers among 100 measurements (14.00%)
  6 (6.00%) low severe
  1 (1.00%) low mild
  4 (4.00%) high mild
  3 (3.00%) high severe

in_list_utf8(10) (1024, 0.2) IN (3, 0)
                        time:   [3.6786 µs 3.6814 µs 3.6845 µs]
                        change: [-12.468% -12.074% -11.714%] (p = 0.00 < 0.05)
                        Performance has improved.
Found 3 outliers among 100 measurements (3.00%)
  2 (2.00%) high mild
  1 (1.00%) high severe

in_list_utf8(20) (1024, 0.2) IN (3, 0)
                        time:   [3.4976 µs 3.4999 µs 3.5020 µs]
                        change: [-15.706% -15.360% -14.950%] (p = 0.00 < 0.05)
                        Performance has improved.
Found 2 outliers among 100 measurements (2.00%)
  1 (1.00%) high mild
  1 (1.00%) high severe

in_list_f32 (1024, 0.2) IN (3, 0)
                        time:   [2.8379 µs 2.8439 µs 2.8503 µs]
                        change: [+2.1085% +2.5037% +2.8881%] (p = 0.00 < 0.05)
                        Performance has regressed.
Found 4 outliers among 100 measurements (4.00%)
  3 (3.00%) high mild
  1 (1.00%) high severe

in_list_i32 (1024, 0.2) IN (3, 0)
                        time:   [2.6805 µs 2.6821 µs 2.6837 µs]
                        change: [-3.4302% -3.1269% -2.8328%] (p = 0.00 < 0.05)
                        Performance has improved.
Found 1 outliers among 100 measurements (1.00%)
  1 (1.00%) high severe

in_list_utf8(5) (1024, 0) IN (10, 0)
                        time:   [2.2531 µs 2.2534 µs 2.2538 µs]
                        change: [-18.069% -17.810% -17.527%] (p = 0.00 < 0.05)
                        Performance has improved.
Found 10 outliers among 100 measurements (10.00%)
  1 (1.00%) low severe
  1 (1.00%) low mild
  4 (4.00%) high mild
  4 (4.00%) high severe

in_list_utf8(10) (1024, 0) IN (10, 0)
                        time:   [2.2536 µs 2.2540 µs 2.2544 µs]
                        change: [-16.727% -16.466% -16.193%] (p = 0.00 < 0.05)
                        Performance has improved.
Found 11 outliers among 100 measurements (11.00%)
  7 (7.00%) high mild
  4 (4.00%) high severe

in_list_utf8(20) (1024, 0) IN (10, 0)
                        time:   [2.2536 µs 2.2539 µs 2.2542 µs]
                        change: [-19.765% -19.503% -19.251%] (p = 0.00 < 0.05)
                        Performance has improved.
Found 12 outliers among 100 measurements (12.00%)
  1 (1.00%) low mild
  8 (8.00%) high mild
  3 (3.00%) high severe

in_list_f32 (1024, 0) IN (10, 0)
                        time:   [2.2557 µs 2.2569 µs 2.2585 µs]
                        change: [-20.856% -20.602% -20.348%] (p = 0.00 < 0.05)
                        Performance has improved.
Found 4 outliers among 100 measurements (4.00%)
  1 (1.00%) high mild
  3 (3.00%) high severe

in_list_i32 (1024, 0) IN (10, 0)
                        time:   [1.9778 µs 1.9782 µs 1.9787 µs]
                        change: [-34.158% -33.945% -33.739%] (p = 0.00 < 0.05)
                        Performance has improved.
Found 6 outliers among 100 measurements (6.00%)
  3 (3.00%) high mild
  3 (3.00%) high severe

in_list_utf8(5) (1024, 0.2) IN (10, 0)
                        time:   [3.6175 µs 3.6201 µs 3.6232 µs]
                        change: [-68.808% -68.710% -68.617%] (p = 0.00 < 0.05)
                        Performance has improved.
Found 8 outliers among 100 measurements (8.00%)
  4 (4.00%) high mild
  4 (4.00%) high severe

in_list_utf8(10) (1024, 0.2) IN (10, 0)
                        time:   [3.6425 µs 3.6457 µs 3.6491 µs]
                        change: [-68.267% -68.165% -68.062%] (p = 0.00 < 0.05)
                        Performance has improved.
Found 4 outliers among 100 measurements (4.00%)
  3 (3.00%) high mild
  1 (1.00%) high severe

in_list_utf8(20) (1024, 0.2) IN (10, 0)
                        time:   [3.5083 µs 3.5108 µs 3.5136 µs]
                        change: [-70.854% -70.761% -70.665%] (p = 0.00 < 0.05)
                        Performance has improved.
Found 12 outliers among 100 measurements (12.00%)
  8 (8.00%) low mild
  4 (4.00%) high severe

in_list_f32 (1024, 0.2) IN (10, 0)
                        time:   [2.8664 µs 2.8712 µs 2.8757 µs]
                        change: [-29.246% -28.979% -28.721%] (p = 0.00 < 0.05)
                        Performance has improved.
Found 1 outliers among 100 measurements (1.00%)
  1 (1.00%) high severe

in_list_i32 (1024, 0.2) IN (10, 0)
                        time:   [2.6672 µs 2.6681 µs 2.6691 µs]
                        change: [-32.655% -32.361% -32.099%] (p = 0.00 < 0.05)
                        Performance has improved.
Found 3 outliers among 100 measurements (3.00%)
  1 (1.00%) high mild
  2 (2.00%) high severe

in_list_utf8(5) (1024, 0) IN (100, 0)
                        time:   [2.2506 µs 2.2509 µs 2.2512 µs]
                        change: [-67.619% -67.517% -67.421%] (p = 0.00 < 0.05)
                        Performance has improved.
Found 4 outliers among 100 measurements (4.00%)
  3 (3.00%) high mild
  1 (1.00%) high severe

in_list_utf8(10) (1024, 0) IN (100, 0)
                        time:   [2.2726 µs 2.2730 µs 2.2734 µs]
                        change: [-69.093% -69.000% -68.932%] (p = 0.00 < 0.05)
                        Performance has improved.
Found 5 outliers among 100 measurements (5.00%)
  3 (3.00%) high mild
  2 (2.00%) high severe

in_list_utf8(20) (1024, 0) IN (100, 0)
                        time:   [2.2507 µs 2.2510 µs 2.2514 µs]
                        change: [-70.105% -69.999% -69.890%] (p = 0.00 < 0.05)
                        Performance has improved.
Found 9 outliers among 100 measurements (9.00%)
  5 (5.00%) high mild
  4 (4.00%) high severe

in_list_f32 (1024, 0) IN (100, 0)
                        time:   [2.2542 µs 2.2546 µs 2.2552 µs]
                        change: [-20.704% -20.456% -20.184%] (p = 0.00 < 0.05)
                        Performance has improved.
Found 10 outliers among 100 measurements (10.00%)
  6 (6.00%) high mild
  4 (4.00%) high severe

in_list_i32 (1024, 0) IN (100, 0)
                        time:   [1.9909 µs 1.9912 µs 1.9916 µs]
                        change: [-67.303% -67.205% -67.111%] (p = 0.00 < 0.05)
                        Performance has improved.
Found 8 outliers among 100 measurements (8.00%)
  1 (1.00%) low mild
  2 (2.00%) high mild
  5 (5.00%) high severe

in_list_utf8(5) (1024, 0.2) IN (100, 0)
                        time:   [3.7921 µs 3.7937 µs 3.7953 µs]
                        change: [-71.119% -71.026% -70.921%] (p = 0.00 < 0.05)
                        Performance has improved.
Found 6 outliers among 100 measurements (6.00%)
  5 (5.00%) high mild
  1 (1.00%) high severe

in_list_utf8(10) (1024, 0.2) IN (100, 0)
                        time:   [3.9309 µs 3.9333 µs 3.9358 µs]
                        change: [-72.648% -72.555% -72.455%] (p = 0.00 < 0.05)
                        Performance has improved.
Found 12 outliers among 100 measurements (12.00%)
  5 (5.00%) high mild
  7 (7.00%) high severe

in_list_utf8(20) (1024, 0.2) IN (100, 0)
                        time:   [3.6742 µs 3.6784 µs 3.6829 µs]
                        change: [-73.143% -73.049% -72.962%] (p = 0.00 < 0.05)
                        Performance has improved.
Found 4 outliers among 100 measurements (4.00%)
  3 (3.00%) high mild
  1 (1.00%) high severe

in_list_f32 (1024, 0.2) IN (100, 0)
                        time:   [2.9426 µs 2.9447 µs 2.9469 µs]
                        change: [-67.345% -67.247% -67.137%] (p = 0.00 < 0.05)
                        Performance has improved.
Found 2 outliers among 100 measurements (2.00%)
  1 (1.00%) high mild
  1 (1.00%) high severe

in_list_i32 (1024, 0.2) IN (100, 0)
                        time:   [2.7303 µs 2.7312 µs 2.7322 µs]
                        change: [-74.380% -74.291% -74.202%] (p = 0.00 < 0.05)
                        Performance has improved.
Found 8 outliers among 100 measurements (8.00%)
  6 (6.00%) high mild
  2 (2.00%) high severe

What changes are included in this PR?

Are there any user-facing changes?

No

@github-actions github-actions bot added core Core DataFusion crate physical-expr Changes to the physical-expr crates labels Nov 1, 2022

/// Size at which to use a Set rather than Vec for `IN` / `NOT IN`
/// Value chosen by the benchmark at
/// https://github.com/apache/arrow-datafusion/pull/2156#discussion_r845198369
/// TODO: add switch codeGen in In_List
static OPTIMIZER_INSET_THRESHOLD: usize = 30;
static OPTIMIZER_INSET_THRESHOLD: usize = 10;
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I need to double-check whether we even need this anymore

Comment on lines +98 to +99
for<'a> &'a T: ArrayAccessor,
for<'a> <&'a T as ArrayAccessor>::Item: PartialEq + HashValue,
Copy link
Contributor Author

@tustvold tustvold Nov 1, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is gross, not really sure how to avoid it though as the lifetime of the downcast & dyn Array necessarily has a lifetime less than the lifetime of ArraySet... So we need to HRTB magic...

.map(|expr| {
expr.evaluate(batch).and_then(|r| match r {
ColumnarValue::Array(_) => Err(DataFusionError::Execution(
"InList expression must evaluate to a scalar".to_string(),
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is consistent with the code before, which instead returned "InList does not yet support nested columns". I think this error message is more clear about what the cause actually is, it has nothing to do with nested columns at all.

See #3766

@tustvold tustvold mentioned this pull request Nov 1, 2022
@tustvold tustvold changed the title Simplify InListExpr Simplify InListExpr ~70% Faster Nov 1, 2022
@@ -2068,50 +2069,6 @@ mod tests {
lit(struct_literal)
}

#[tokio::test]
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We now always use a HashSet see below

/// Value chosen by the benchmark at
/// https://github.com/apache/arrow-datafusion/pull/2156#discussion_r845198369
/// TODO: add switch codeGen in In_List
static OPTIMIZER_INSET_THRESHOLD: usize = 30;
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

With the changes in this PR the hashset is only slower when list contains 1 or 2 non-null primitive values. I did not feel this warranted the additional complexity, especially as the optimizer should really rewrite an InList of two elements to a disjunctive boolean expression.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is a future ticket, we can create a new issue.

Copy link
Contributor

@Dandandan Dandandan Nov 2, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We should probably rewrite inlist exprs with few elements from x in (0, 1) to x=1 or x=2.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

filed #4089 to track

@@ -1543,237 +932,12 @@ mod tests {
Ok(())
}

#[test]
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We no longer need these duplicated tests as there isn't a separate execution path based on the length of the InList

$(impl HashValue for $t {
fn hash_one(&self, state: &RandomState) -> u64 {
state.hash_one(self.to_le_bytes())
state.hash_one(<$i>::from_ne_bytes(self.to_ne_bytes()))
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is a drive by fix that improves hashing performance of floating points. This is because there are specialized methods for hashing i32, i64 as opposed to [u8;N]

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looking at this now, are we correctly handling NaNs here?
Looking at the ordered-float implementation for Hash, it first normalizes nans https://docs.rs/ordered-float/3.3.0/src/ordered_float/lib.rs.html#160

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

See #4051

TLDR OrderedFloat is a more strict ordering than we need

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I know it is a pain, but i would recommend pulling this into its own PR

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This doesn't materially change the hashing? It was a bitwise hash before and after, all that changes is it hashes an integer comprised of the bytes instead of an array of bytew

@tustvold tustvold changed the title Simplify InListExpr ~70% Faster Simplify InListExpr ~20-70% Faster Nov 1, 2022
@tustvold tustvold marked this pull request as ready for review November 1, 2022 22:24
Copy link
Contributor

@alamb alamb left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I went through this PR quite carefully and it looks 👍
Thank you @tustvold

$(impl HashValue for $t {
fn hash_one(&self, state: &RandomState) -> u64 {
state.hash_one(self.to_le_bytes())
state.hash_one(<$i>::from_ne_bytes(self.to_ne_bytes()))
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I know it is a pain, but i would recommend pulling this into its own PR

let in_array = &self.array;
let has_nulls = in_data.null_count() != 0;

ArrayIter::new(v)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I wonder if it would be more performant to use hash_array to has the array all in one go rather than doing it an element at a time?

I was thinking that since this is the hot path the more vectorization we get the better

@@ -945,7 +323,6 @@ impl PartialEq<dyn Any> for InListExpr {
self.expr.eq(&x.expr)
&& expr_list_eq_any_order(&self.list, &x.list)
&& self.negated == x.negated
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
&& self.negated == x.negated
&& self.negated == x.negated
// since self.static_filter is derived from self.list, not necessary to check here

@@ -1809,58 +976,6 @@ mod tests {
Ok(())
}

#[test]
fn in_list_set_timestamp() -> Result<()> {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

FWIW I verified there is still coverage of timestamp testing above

Co-authored-by: Andrew Lamb <andrew@nerdnetworks.org>
@alamb
Copy link
Contributor

alamb commented Nov 2, 2022

cc @Ted-Jiang and @liukun4515 as well

@tustvold tustvold merged commit 1287529 into apache:master Nov 2, 2022
@ursabot
Copy link

ursabot commented Nov 2, 2022

Benchmark runs are scheduled for baseline = 8d6448e and contender = 1287529. 1287529 is a master commit associated with this PR. Results will be available as each benchmark for each run completes.
Conbench compare runs links:
[Skipped ⚠️ Benchmarking of arrow-datafusion-commits is not supported on ec2-t3-xlarge-us-east-2] ec2-t3-xlarge-us-east-2
[Skipped ⚠️ Benchmarking of arrow-datafusion-commits is not supported on test-mac-arm] test-mac-arm
[Skipped ⚠️ Benchmarking of arrow-datafusion-commits is not supported on ursa-i9-9960x] ursa-i9-9960x
[Skipped ⚠️ Benchmarking of arrow-datafusion-commits is not supported on ursa-thinkcentre-m75q] ursa-thinkcentre-m75q
Buildkite builds:
Supported benchmarks:
ec2-t3-xlarge-us-east-2: Supported benchmark langs: Python, R. Runs only benchmarks with cloud = True
test-mac-arm: Supported benchmark langs: C++, Python, R
ursa-i9-9960x: Supported benchmark langs: Python, R, JavaScript
ursa-thinkcentre-m75q: Supported benchmark langs: C++, Java

Dandandan pushed a commit to yuuch/arrow-datafusion that referenced this pull request Nov 5, 2022
* Simplify InList expression

* Simplify

* Hash floats as integers

* Fix tests

* Format

* Update datafusion-cli lockfile

* Sort Cargo.toml

* Update datafusion/physical-expr/src/expressions/in_list.rs

Co-authored-by: Andrew Lamb <andrew@nerdnetworks.org>

Co-authored-by: Andrew Lamb <andrew@nerdnetworks.org>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
core Core DataFusion crate physical-expr Changes to the physical-expr crates
Projects
None yet
5 participants