Skip to content

Conversation

@pepijnve
Copy link
Contributor

@pepijnve pepijnve commented Sep 28, 2025

Which issue does this PR close?

Rationale for this change

#17357 introduced a change that replaces coalesce function calls with case expressions. In the current implementation these two differ in the way they report their nullability. coalesce is more precise than case all will report itself as not nullable in situations where the equivalent case does report being nullable.

The rest of the codebase currently does not expect the nullability property of an expression to change as a side effect of expression simplification. This PR is a first attempt to align the nullability of coalesce and case.

What changes are included in this PR?

Tweaks to the nullable logic for the logical and physical case expression code to report case as being not nullable in more situations.

  • For logical case, a best effort const evaluation of 'when' expressions is done to determine 'then' reachability. The code errs on the conservative side wrt nullability.
  • For physical case, const evaluation of 'when' expressions using a placeholder record batch is attempted to determine 'then' reachability. Again if const evaluation is not possible, the code errs on the conservative side.
  • The optimizer schema check has been relaxed slightly to allow nullability to be removed by optimizer passes without having to disable the schema check entirely
  • The panic'ing benchmark has been reenabled

Are these changes tested?

Additional unit tests have been added to test the new logic.

Are there any user-facing changes?

No

@github-actions github-actions bot added logical-expr Logical plan and expressions physical-expr Changes to the physical-expr crates core Core DataFusion crate labels Sep 28, 2025
@pepijnve pepijnve marked this pull request as ready for review September 29, 2025 10:52
@pepijnve pepijnve force-pushed the issue_17801 branch 3 times, most recently from 4bbaa82 to 7f8d7cf Compare September 29, 2025 12:56
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.

Thank you for this PR @pepijnve --

I am not quite sure about this implementation (I am hoping #17628 might solve the problem too with more sophisticated case folding)

However, I verified it does solve the problem with running the benchmarks so from that perspective I think we should proceed

My only real concern is that the newly added tests cover only the new code, and not the "end to end" behavior you tracked down (namely that the case pattern with coalesce changes the nullability).

Would it be possible to add some of the cases as expr simplification tests too? Somewhere like here?

Comment on lines 924 to 925
when(binary_expr(col("foo"), Operator::Eq, lit(5)), col("foo"))
.otherwise(lit(0))?,
Copy link
Contributor

Choose a reason for hiding this comment

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

Minor: You can probably make this more concise using the eq method, something like this:

Suggested change
when(binary_expr(col("foo"), Operator::Eq, lit(5)), col("foo"))
.otherwise(lit(0))?,
when(col("foo").eq(lit(5))), col("foo")).otherwise(lit(0))?,

Copy link
Contributor

Choose a reason for hiding this comment

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

likewise there is Expr::and for ands that could be used as well below

However, the current setup of using and as a prefix is pretty clear too, so maybe what you have here is actually more readable.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Ah I missed that. I was looking for prefix versions, and hadn't realised infix ones existed too.

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 ended up sticking with prefix notation for the boolean combinators and infix for the rest. Using infix for the boolean made it hard to read. I've also added the SQL equivalent as a comment.

assert!(expr.nullable(&get_schema(false)).unwrap());
}

fn check_nullability(
Copy link
Contributor

Choose a reason for hiding this comment

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

I found this a little confusing at first, because it makes an explicit assumption that expr's will never introduce nulls (in order for !expr.nullable(&get_schema(false))?, to be true). So for example, it wouldn't do the right thing with the NULLIF function NULLIF(foo, 25) or something

Maybe some comments would help

Suggested change
fn check_nullability(
/// Verifies that `expr` has `nullable` nullability when the 'foo' column is
/// null.
/// Also assumes and verifies that `expr` is NOT nullable when 'foo' is NOT null
fn check_nullability(

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've reworked the logical plan test cases already to (hopefully) make it more obvious what's going on. I hadn't given this function much thought since it was only a test thing.

check_nullability(
when(binary_expr(col("foo"), Operator::Eq, lit(5)), col("foo"))
.otherwise(lit(0))?,
true,
Copy link
Contributor

Choose a reason for hiding this comment

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

technically this could also be reported as false, given that if foo is null, then the expr resolves to 0 (non null)

> create table t(foo int) as values (0), (NULL), (5);
0 row(s) fetched.
Elapsed 0.001 seconds.

> select foo, CASE WHEN foo=5 THEN foo ELSE 0 END from t;
+------+---------------------------------------------------------+
| foo  | CASE WHEN t.foo = Int64(5) THEN t.foo ELSE Int64(0) END |
+------+---------------------------------------------------------+
| 0    | 0                                                       |
| NULL | 0                                                       |
| 5    | 5                                                       |
+------+---------------------------------------------------------+
3 row(s) fetched.
Elapsed 0.002 seconds.

However, maybe we can improve that in a follow on 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.

Agreed, the const evaluation is far from complete. I tried to do something good enough for the coalesce simplification initially.
I was wondering the whole time if there isn't some existing null analysis logic somewhere in the codebase we could reuse. The best I could come up with is rewriting the full expression by replacing the then expression with literal NULL and then attempting const evaluation. But that got me worrying about planning overhead again.

when(
or(
is_not_null(col("foo")),
binary_expr(col("foo"), Operator::Eq, lit(5)),
Copy link
Contributor

Choose a reason for hiding this comment

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

as above, I don't think this expression can everr be true so this overall expression is still non nullable

col("foo"),
)
.otherwise(lit(0))?,
true,
Copy link
Contributor

Choose a reason for hiding this comment

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

Here too -- this expression is not nullabile

> select foo, CASE WHEN foo=5 OR foo IS NOT NULL THEN foo ELSE 0 END from t;
+------+------------------------------------------------------------------------------+
| foo  | CASE WHEN t.foo = Int64(5) OR t.foo IS NOT NULL THEN t.foo ELSE Int64(0) END |
+------+------------------------------------------------------------------------------+
| 0    | 0                                                                            |
| NULL | 0                                                                            |
| 5    | 5                                                                            |
+------+------------------------------------------------------------------------------+
3 row(s) fetched.
Elapsed 0.002 seconds.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

FWIW, if you comment out the filter step (i.e. revert to the pre-patch version) all of these cases are reported as being nullable. The scope of this PR is to get at least some cases that are definitely not nullable reported as such, not ensure all cases are reported correctly.

.otherwise(lit(0))?,
true,
get_schema,
)?;
Copy link
Contributor

Choose a reason for hiding this comment

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

Can you also please add a check with is_null in the OR clause (which should be null)

Something like the equivalent to

> select foo, CASE WHEN foo=5 OR foo IS NULL THEN foo ELSE 0 END from t;
+------+--------------------------------------------------------------------------+
| foo  | CASE WHEN t.foo = Int64(5) OR t.foo IS NULL THEN t.foo ELSE Int64(0) END |
+------+--------------------------------------------------------------------------+
| 0    | 0                                                                        |
| NULL | NULL                                                                     |
| 5    | 5                                                                        |
+------+--------------------------------------------------------------------------+
3 row(s) fetched.
Elapsed 0.000 seconds.

Like

      check_nullability(
            when(
                or(
                    binary_expr(col("foo"), Operator::Eq, lit(5)),
                    is_null(col("foo")),
                ),
                col("foo"),
            )
            .otherwise(lit(0))?,
            true,
            get_schema,
        )?;

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've added this test case

@pepijnve
Copy link
Contributor Author

pepijnve commented Sep 29, 2025

I am not quite sure about this implementation (I am hoping #17628 might solve the problem too with more sophisticated case folding)

I warned you it wasn't very elegant. 😄 I don't think #17628 covers the same thing though. What we're trying to do here is get ExprSchemable::nullable to report an accurate value outside of the optimiser. Ideally you would want that to work both before and after case folding.
I agree that there is a lot of overlap in the required logic though. If you were to take the case expression, replace the then expression trees with literal NULL everywhere they occur, then perform case folding, and then perform null analysis then you would get the same result.

My only real concern is that the newly added tests cover only the new code, and not the "end to end" behavior you tracked down (namely that the case pattern with coalesce changes the nullability).

Would it be possible to add some of the cases as expr simplification tests too? Somewhere like here?

I'm not sure what kind of test you have in mind. The end to end case is (admittedly very indirectly) covered by TPC-DS query 75 and the removal of the double optimisation. If you revert the production code change in this PR, but keep the test change you'll see that it fails.

For the simplifier itself, I was wondering if there shouldn't be some internal assertions that verifies that the result of calling ScalarUDF::simplify doesn't change key aspects of the expression that the schema also encodes. Both the data type and the nullability should not change since that causes the expression and the schema to be mismatched.

@pepijnve
Copy link
Contributor Author

pepijnve commented Sep 30, 2025

@alamb thinking about this a bit more. I'm going to struggle expressing myself sufficiently clearly here, but I'll try to explain the idea behind what I'm doing. Maybe that can help us figure out a better way to express the idea.

What I'm trying to do is improve the accuracy of the predicate is_nullable(expr) specifically for CASE expressions.
In the current code this predicate is implemented by checking (in pseudo code) case_expr.when_then.any?((when, then) -> is_nullable(then)) || is_nullable(case_expr.else). This results in quite a few CASE expressions being reported as nullable even though they're not.

In particular there's one interesting case (pun not intended) which results from the coalesce simplification and that is CASE WHEN x IS NOT NULL THEN x ELSE y. If the expression x is nullable, is_nullable will currently report the entire case expression as nullable. The implementation does not take into account that there is a guard clause preventing the null value of x from being returned.

What I attempted to do in this PR is to look at the more general form WHEN f(x) THEN x where f(x) is some arbitrary predicate that may or may not depend on the value of x. What the code is trying to do is to const evaluate f(NULL). If it can with 100% certainty (i.e. Some is returned) and the evaluated value is false, then predicate f guarantees this particular branch of the case expression from ever returning a NULL and we can ignore the nullability of x.

I tried to implement this in a cheap, but imprecise way. My rationale was that even though it's not perfect, it's an improvement in accuracy over the current code.
A possible alternative would be to rewrite the expression corresponding to f using the binding x = null and then attempting to const evaluate using the existing const evaluation code. That introduces a dependency from the logical expression module to the optimiser though and would probably have a longer run time than the current crude approximation.

@pepijnve
Copy link
Contributor Author

I've massaged the logical plan version of the code a bit further already to hopefully clarify what it's doing. I then ran the test cases with logging output rather than assertions before and after the extra filtering to illustrate what's being changed. After the change all tests pass. Before the patch it reports the following

CASE WHEN x IS NOT NULL THEN x ELSE Int32(0) END nullable? should be false, but was true
CASE WHEN NOT x IS NULL THEN x ELSE Int32(0) END nullable? should be false, but was true
CASE WHEN x IS NOT NULL AND x = Int32(5) THEN x ELSE Int32(0) END nullable? should be false, but was true
CASE WHEN x = Int32(5) AND x IS NOT NULL THEN x ELSE Int32(0) END nullable? should be false, but was true
CASE WHEN x = Int32(5) AND x IS NOT NULL OR x = bar AND x IS NOT NULL THEN x ELSE Int32(0) END nullable? should be false, but was true

@pepijnve
Copy link
Contributor Author

@alamb I've taken the logical expression portion of the PR another step further which ensures correct answers for the expressions you mentioned earlier. I can complete the physical expression portion as well if you like. Unless you tell me this path is a dead end.

@alamb
Copy link
Contributor

alamb commented Sep 30, 2025

@alamb I've taken the logical expression portion of the PR another step further which ensures correct answers for the expressions you mentioned earlier. I can complete the physical expression portion as well if you like. Unless you tell me this path is a dead end.

Thank you -- I will try and get to this one asap. Somehow every time i think I am getting the queue of reviews under control there are like 50 new notifications ! It is a good problem to have.

@pepijnve
Copy link
Contributor Author

Thank you -- I will try and get to this one asap. Somehow every time i think I am getting the queue of reviews under control there are like 50 new notifications ! It is a good problem to have.

No pressure from my side. I just write up my notes and move on to the next thing. Async delayed response is fine.

@pepijnve
Copy link
Contributor Author

pepijnve commented Oct 1, 2025

I experimented a bit with the rewrite + const eval approach on the physical expression side of things. While attractive and simple to implement, the downside is that it's going to be very hard to ensure the logical and physical side agree. Logical needs to work without ExecutionProps so it has less information available to it compared to the PhysicalExpr tree. I don't see a way to resolve that. As a consequence I ended up with an limited ad hoc version of const evaluation on the logical side and would have to do the same for physical which isn't really ideal from a DRY perspective.

@alamb
Copy link
Contributor

alamb commented Oct 6, 2025

Than you -- this is on my list of things to review shortly

[dependencies]
arrow = { workspace = true }
async-trait = { workspace = true }
bitflags = "2.9.4"
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 already a dependency via arrow-schema so I assumed it would be ok to use.

// if the rule is not permitted to change the schema, confirm that it did not change.
if self.rule.schema_check() && plan.schema() != previous_schema {
if self.rule.schema_check()
&& !is_allowed_schema_change(previous_schema.as_ref(), plan.schema().as_ref())
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 change relaxes the schema check slightly. It now allows individual fields to change from nullable to not-nullable which is ok because it only allow a strict subset of the original schema. schema_check has documentation stating that you should disable the schema check entirely if you want to do this. Seemed better to not have to disable checking entirely.

@alamb
Copy link
Contributor

alamb commented Nov 9, 2025

@alamb Sorry to keep poking you about this. I have a hard time letting interesting problems go; they live in my head rent free.

This is one of the reasons we (at least I) love working with you!

But I'll park this one for good if you think it's really a dead end.

I don't necessarily think it is a dead end, I am just trying to balance getting a release out and

  1. I haven't had enough time to review this in detail.
  2. I think it is tricky enough that there may be unintended consequences

So what I think we should do is:

  1. Back out the rewrite that cause this internal error for 51 (I will go make the PR now)
  2. Continue working on this issue in parallel

I will try and find enough time to properly review this PR this upcoming week

@alamb
Copy link
Contributor

alamb commented Nov 9, 2025

@pepijnve have you already tried (just) special casing nullability reporting in case expressions like

CASE 
  WHEN <x> IS NOT NULL THEN <x>
  WHEN <y> IS NOT NULL THEN <y>
  ELSE <z>

To be the nullability of z?

(this is basically a special case for the pattern created by the coalesce simplification

Please forgive me if you have already tried this, I can't remember the entire history

I realize this PR is the same idea but implements a more general case of it

@alamb
Copy link
Contributor

alamb commented Nov 9, 2025

BTW I don't think this PR obviates these other PRs -- I think instead it unblocks them / allows them to merge

alamb added a commit that referenced this pull request Nov 10, 2025
…ion (#18567)

Note this targets the branch-51 release branch

## Which issue does this PR close?

- part of #17558
- resolves #17801 in the 51
release branch

## Rationale for this change

- We merged some clever rewrites for `coalesce` and `nvl2` to use `CASE`
which are faster and more correct (👏 @chenkovsky @kosiew )
- However, these rewrites cause subtle schema mismatches in some cases
planning (b/c the CASE simplification nullability logic can't determine
the correct nullability in some cases - see
#17801)
- @pepijnve has some heroic efforts to fix the schema mismatch in
#17813 (comment),
but it is non trivial and I am worried about merging it so close to the
51 release and introducing new edge cases

## What changes are included in this PR?

1. Revert #17357 /
e5dcc8c
3. Revert #17991 /
ea83c26
2. Revert #18191 /
22c4214
2. Cherry-pick 6202254, a test that
reproduces the schema mismatch issue (from
#18536)
3. Cherry-pick 735cacf, a fix for the
benchmarks that regressed due to the revert (from
#17833)
4. Update datafusion-testing (see separate PR here) for extended tests
(see apache/datafusion-testing#15)

## Are these changes tested?

Yes I added a new test

## Are there any user-facing changes?

<!--
If there are user-facing changes then we may require documentation to be
updated before approving the PR.
-->

<!--
If there are any breaking changes to public APIs, please add the `api
change` label.
-->
@pepijnve
Copy link
Contributor Author

BTW I don't think this PR obviates these other PRs

I added that since the benchmark is enabled and not double optimized in this PR as well.

@pepijnve
Copy link
Contributor Author

@pepijnve have you already tried (just) special casing nullability reporting in case expressions like ... to be the nullability of z?
(this is basically a special case for the pattern created by the coalesce simplification
Please forgive me if you have already tried this, I can't remember the entire history
I realize this PR is the same idea but implements a more general case of it

No worries, it's been a twisty path so far. That was v0.1 I think.

To implement that you need to add some logic in when branch loop that filters out certain branches where the nullability of the then expression is not relevant. The simplest check of course is for w, t that w == is_not_null(t). So that's exactly what I added in a function named const_result_when_value_is_null which was then used in the loop.

After adding that it was immediately obvious that a number of other situations are just as trivial to test, so I thought I might as well add those. That's the version in the first commit 408cee1ccd544fa6e7d17b52582129bb86c362e6.

It was #17813 (comment) that got me thinking that this can be made even more general. The other feedback I got in between then and now is what led to the current state of the PR.

I've been familiarising myself with more of the code in optimizer as part of this work. I think one thing we could consider is to move GuaranteeRewriter to expr-common and then use that to rewrite the when expression. I avoided rewriting the logical expr out of a concern that this might be too wasteful, but the code would definitely be simpler (drop the callback function stuff) if we rewrite and then determine the predicate bounds.

Even better would be to also leverage the simplification and const evaluation from optimizer, but since that requires a dependency on physical-expr that's going to be hard to do.

@pepijnve
Copy link
Contributor Author

In 427fc30 I've added an SLT that illustrates how better nullability reporting may allow optimisation of certain queries. It's a contrived query, but it's just a test

The query

SELECT CASE WHEN CASE WHEN a IS NOT NULL THEN a ELSE 1 END IS NOT NULL THEN a ELSE 1 END FROM (
    VALUES (10), (20), (30)
  ) t(a)

get squashed down to

ProjectionExec: expr=[column1@0 as CASE WHEN CASE WHEN t.a IS NOT NULL THEN t.a ELSE Int64(1) END IS NOT NULL THEN t.a ELSE Int64(1) END]

while current main will evaluate this as

ProjectionExec: expr=[CASE WHEN CASE WHEN column1@0 IS NOT NULL THEN column1@0 ELSE 1 END IS NOT NULL THEN column1@0 ELSE 1 END as CASE WHEN CASE WHEN t.a IS NOT NULL THEN t.a ELSE Int64(1) END IS NOT NULL THEN t.a ELSE Int64(1) END]

@alamb
Copy link
Contributor

alamb commented Nov 11, 2025

🤖 ./gh_compare_branch_bench.sh Benchmark Script Running
Linux aal-dev 6.14.0-1018-gcp #19~24.04.1-Ubuntu SMP Wed Sep 24 23:23:09 UTC 2025 x86_64 x86_64 x86_64 GNU/Linux
Comparing issue_17801 (4b879e4) to e406689 diff
BENCH_NAME=sql_planner
BENCH_COMMAND=cargo bench --bench sql_planner
BENCH_FILTER=
BENCH_BRANCH_NAME=issue_17801
Results will be posted here when complete

@pepijnve
Copy link
Contributor Author

I’m trying to see if I can make more use of existing code in the meantime. The three PRs related to (Nullable)Interval came out of that work.

@alamb
Copy link
Contributor

alamb commented Nov 11, 2025

🤖: Benchmark completed

Details

group                                                 issue_17801                            main
-----                                                 -----------                            ----
logical_aggregate_with_join                           1.00    633.3±4.52µs        ? ?/sec    1.01    639.4±3.99µs        ? ?/sec
logical_select_all_from_1000                          1.06     12.0±0.11ms        ? ?/sec    1.00     11.3±0.35ms        ? ?/sec
logical_select_one_from_700                           1.00    419.0±1.79µs        ? ?/sec    1.02    428.3±2.84µs        ? ?/sec
logical_trivial_join_high_numbered_columns            1.00    379.6±5.04µs        ? ?/sec    1.00    380.5±1.73µs        ? ?/sec
logical_trivial_join_low_numbered_columns             1.00    364.5±3.95µs        ? ?/sec    1.01    367.0±2.33µs        ? ?/sec
physical_intersection                                 1.00    836.6±5.43µs        ? ?/sec    1.02    851.6±3.95µs        ? ?/sec
physical_join_consider_sort                           1.00  1401.3±13.09µs        ? ?/sec    1.01   1409.6±9.76µs        ? ?/sec
physical_join_distinct                                1.00    354.9±1.32µs        ? ?/sec    1.01    357.4±1.39µs        ? ?/sec
physical_many_self_joins                              1.00      9.7±0.03ms        ? ?/sec    1.01      9.8±0.04ms        ? ?/sec
physical_plan_clickbench_all                          1.00    181.5±1.69ms        ? ?/sec    1.00    181.2±1.96ms        ? ?/sec
physical_plan_clickbench_q1                           1.00      2.4±0.02ms        ? ?/sec    1.00      2.4±0.04ms        ? ?/sec
physical_plan_clickbench_q10                          1.01      3.2±0.04ms        ? ?/sec    1.00      3.2±0.03ms        ? ?/sec
physical_plan_clickbench_q11                          1.01      3.4±0.03ms        ? ?/sec    1.00      3.4±0.03ms        ? ?/sec
physical_plan_clickbench_q12                          1.00      3.5±0.03ms        ? ?/sec    1.00      3.6±0.04ms        ? ?/sec
physical_plan_clickbench_q13                          1.01      3.2±0.03ms        ? ?/sec    1.00      3.2±0.04ms        ? ?/sec
physical_plan_clickbench_q14                          1.00      3.4±0.03ms        ? ?/sec    1.00      3.4±0.04ms        ? ?/sec
physical_plan_clickbench_q15                          1.00      3.3±0.03ms        ? ?/sec    1.00      3.3±0.04ms        ? ?/sec
physical_plan_clickbench_q16                          1.00      3.1±0.03ms        ? ?/sec    1.00      3.1±0.03ms        ? ?/sec
physical_plan_clickbench_q17                          1.00      3.2±0.03ms        ? ?/sec    1.00      3.2±0.04ms        ? ?/sec
physical_plan_clickbench_q18                          1.00      2.7±0.02ms        ? ?/sec    1.01      2.8±0.03ms        ? ?/sec
physical_plan_clickbench_q19                          1.00      3.6±0.03ms        ? ?/sec    1.00      3.6±0.04ms        ? ?/sec
physical_plan_clickbench_q2                           1.02      2.8±0.03ms        ? ?/sec    1.00      2.8±0.03ms        ? ?/sec
physical_plan_clickbench_q20                          1.00      2.5±0.02ms        ? ?/sec    1.00      2.5±0.02ms        ? ?/sec
physical_plan_clickbench_q21                          1.00      2.8±0.02ms        ? ?/sec    1.00      2.8±0.02ms        ? ?/sec
physical_plan_clickbench_q22                          1.00      3.4±0.05ms        ? ?/sec    1.00      3.4±0.03ms        ? ?/sec
physical_plan_clickbench_q23                          1.01      3.7±0.04ms        ? ?/sec    1.00      3.7±0.03ms        ? ?/sec
physical_plan_clickbench_q24                          1.00      4.2±0.03ms        ? ?/sec    1.00      4.2±0.04ms        ? ?/sec
physical_plan_clickbench_q25                          1.00      3.0±0.02ms        ? ?/sec    1.00      3.0±0.04ms        ? ?/sec
physical_plan_clickbench_q26                          1.01      2.8±0.02ms        ? ?/sec    1.00      2.7±0.03ms        ? ?/sec
physical_plan_clickbench_q27                          1.00      3.0±0.02ms        ? ?/sec    1.00      3.0±0.03ms        ? ?/sec
physical_plan_clickbench_q28                          1.01      3.7±0.04ms        ? ?/sec    1.00      3.7±0.03ms        ? ?/sec
physical_plan_clickbench_q29                          1.00      4.0±0.04ms        ? ?/sec    1.00      4.0±0.04ms        ? ?/sec
physical_plan_clickbench_q3                           1.00      2.7±0.02ms        ? ?/sec    1.00      2.7±0.02ms        ? ?/sec
physical_plan_clickbench_q30                          1.00     12.7±0.15ms        ? ?/sec    1.00     12.7±0.13ms        ? ?/sec
physical_plan_clickbench_q31                          1.00      3.7±0.03ms        ? ?/sec    1.00      3.7±0.04ms        ? ?/sec
physical_plan_clickbench_q32                          1.01      3.7±0.06ms        ? ?/sec    1.00      3.7±0.04ms        ? ?/sec
physical_plan_clickbench_q33                          1.00      3.2±0.04ms        ? ?/sec    1.00      3.2±0.04ms        ? ?/sec
physical_plan_clickbench_q34                          1.00      2.9±0.03ms        ? ?/sec    1.00      2.9±0.03ms        ? ?/sec
physical_plan_clickbench_q35                          1.00      3.0±0.03ms        ? ?/sec    1.00      3.0±0.03ms        ? ?/sec
physical_plan_clickbench_q36                          1.00      3.7±0.04ms        ? ?/sec    1.00      3.7±0.04ms        ? ?/sec
physical_plan_clickbench_q37                          1.00      3.9±0.05ms        ? ?/sec    1.00      3.9±0.05ms        ? ?/sec
physical_plan_clickbench_q38                          1.01      3.9±0.04ms        ? ?/sec    1.00      3.9±0.07ms        ? ?/sec
physical_plan_clickbench_q39                          1.00      3.7±0.04ms        ? ?/sec    1.00      3.7±0.03ms        ? ?/sec
physical_plan_clickbench_q4                           1.01      2.4±0.02ms        ? ?/sec    1.00      2.4±0.02ms        ? ?/sec
physical_plan_clickbench_q40                          1.00      4.5±0.04ms        ? ?/sec    1.00      4.5±0.06ms        ? ?/sec
physical_plan_clickbench_q41                          1.00      3.9±0.04ms        ? ?/sec    1.00      3.9±0.05ms        ? ?/sec
physical_plan_clickbench_q42                          1.00      3.9±0.04ms        ? ?/sec    1.00      3.8±0.05ms        ? ?/sec
physical_plan_clickbench_q43                          1.01      4.3±0.05ms        ? ?/sec    1.00      4.3±0.04ms        ? ?/sec
physical_plan_clickbench_q44                          1.00      2.6±0.02ms        ? ?/sec    1.01      2.6±0.03ms        ? ?/sec
physical_plan_clickbench_q45                          1.00      2.6±0.01ms        ? ?/sec    1.00      2.6±0.03ms        ? ?/sec
physical_plan_clickbench_q46                          1.01      3.0±0.02ms        ? ?/sec    1.00      3.0±0.03ms        ? ?/sec
physical_plan_clickbench_q47                          1.00      3.6±0.05ms        ? ?/sec    1.00      3.6±0.04ms        ? ?/sec
physical_plan_clickbench_q48                          1.00      4.3±0.04ms        ? ?/sec    1.00      4.3±0.05ms        ? ?/sec
physical_plan_clickbench_q49                          1.01      4.6±0.06ms        ? ?/sec    1.00      4.6±0.06ms        ? ?/sec
physical_plan_clickbench_q5                           1.01      2.7±0.03ms        ? ?/sec    1.00      2.7±0.02ms        ? ?/sec
physical_plan_clickbench_q50                          1.02      4.2±0.05ms        ? ?/sec    1.00      4.1±0.06ms        ? ?/sec
physical_plan_clickbench_q51                          1.00      3.2±0.03ms        ? ?/sec    1.00      3.2±0.04ms        ? ?/sec
physical_plan_clickbench_q6                           1.01      2.7±0.03ms        ? ?/sec    1.00      2.7±0.02ms        ? ?/sec
physical_plan_clickbench_q7                           1.01      2.4±0.03ms        ? ?/sec    1.00      2.4±0.02ms        ? ?/sec
physical_plan_clickbench_q8                           1.01      3.3±0.04ms        ? ?/sec    1.00      3.2±0.03ms        ? ?/sec
physical_plan_clickbench_q9                           1.01      3.1±0.02ms        ? ?/sec    1.00      3.1±0.02ms        ? ?/sec
physical_plan_tpcds_all                               1.02   1052.7±7.39ms        ? ?/sec    1.00   1035.9±3.44ms        ? ?/sec
physical_plan_tpch_all                                1.02     65.4±0.29ms        ? ?/sec    1.00     64.4±0.34ms        ? ?/sec
physical_plan_tpch_q1                                 1.00      2.0±0.05ms        ? ?/sec    1.00      2.0±0.01ms        ? ?/sec
physical_plan_tpch_q10                                1.00      4.0±0.02ms        ? ?/sec    1.00      4.0±0.02ms        ? ?/sec
physical_plan_tpch_q11                                1.00      3.6±0.01ms        ? ?/sec    1.01      3.6±0.02ms        ? ?/sec
physical_plan_tpch_q12                                1.00  1813.1±12.65µs        ? ?/sec    1.00   1807.4±7.45µs        ? ?/sec
physical_plan_tpch_q13                                1.00   1461.1±9.17µs        ? ?/sec    1.00   1457.7±8.26µs        ? ?/sec
physical_plan_tpch_q14                                1.00  1968.8±10.38µs        ? ?/sec    1.00  1974.9±10.59µs        ? ?/sec
physical_plan_tpch_q16                                1.00      2.5±0.01ms        ? ?/sec    1.00      2.5±0.01ms        ? ?/sec
physical_plan_tpch_q17                                1.00      2.6±0.02ms        ? ?/sec    1.00      2.6±0.02ms        ? ?/sec
physical_plan_tpch_q18                                1.00      2.7±0.02ms        ? ?/sec    1.01      2.7±0.02ms        ? ?/sec
physical_plan_tpch_q19                                1.01      3.2±0.02ms        ? ?/sec    1.00      3.2±0.02ms        ? ?/sec
physical_plan_tpch_q2                                 1.00      5.9±0.03ms        ? ?/sec    1.00      5.9±0.04ms        ? ?/sec
physical_plan_tpch_q20                                1.01      3.2±0.01ms        ? ?/sec    1.00      3.2±0.02ms        ? ?/sec
physical_plan_tpch_q21                                1.00      4.3±0.02ms        ? ?/sec    1.00      4.2±0.03ms        ? ?/sec
physical_plan_tpch_q22                                1.01      2.8±0.02ms        ? ?/sec    1.00      2.8±0.01ms        ? ?/sec
physical_plan_tpch_q3                                 1.00      2.7±0.01ms        ? ?/sec    1.01      2.7±0.02ms        ? ?/sec
physical_plan_tpch_q4                                 1.00   1503.2±4.95µs        ? ?/sec    1.00  1507.2±10.10µs        ? ?/sec
physical_plan_tpch_q5                                 1.00      3.3±0.01ms        ? ?/sec    1.00      3.3±0.02ms        ? ?/sec
physical_plan_tpch_q6                                 1.01    863.4±4.13µs        ? ?/sec    1.00    856.1±7.24µs        ? ?/sec
physical_plan_tpch_q7                                 1.00      4.2±0.02ms        ? ?/sec    1.00      4.2±0.03ms        ? ?/sec
physical_plan_tpch_q8                                 1.00      5.5±0.03ms        ? ?/sec    1.00      5.5±0.03ms        ? ?/sec
physical_plan_tpch_q9                                 1.00      4.0±0.01ms        ? ?/sec    1.00      4.0±0.02ms        ? ?/sec
physical_select_aggregates_from_200                   1.01     17.0±0.07ms        ? ?/sec    1.00     16.9±0.06ms        ? ?/sec
physical_select_all_from_1000                         1.02     24.6±0.11ms        ? ?/sec    1.00     24.2±0.25ms        ? ?/sec
physical_select_one_from_700                          1.00   1088.3±6.35µs        ? ?/sec    1.02   1113.4±7.50µs        ? ?/sec
physical_sorted_union_order_by_10                     1.00     13.0±0.08ms        ? ?/sec    1.00     12.9±0.10ms        ? ?/sec
physical_sorted_union_order_by_50                     1.00    378.7±2.12ms        ? ?/sec    1.00    378.3±3.80ms        ? ?/sec
physical_theta_join_consider_sort                     1.00  1783.3±12.47µs        ? ?/sec    1.00   1775.6±8.87µs        ? ?/sec
physical_unnest_to_join                               1.00  1866.3±11.76µs        ? ?/sec    1.00   1870.4±8.92µs        ? ?/sec
physical_window_function_partition_by_12_on_values    1.01   1088.0±7.16µs        ? ?/sec    1.00   1080.1±4.01µs        ? ?/sec
physical_window_function_partition_by_30_on_values    1.01      2.3±0.01ms        ? ?/sec    1.00      2.2±0.01ms        ? ?/sec
physical_window_function_partition_by_4_on_values     1.01    656.4±4.68µs        ? ?/sec    1.00    652.0±3.60µs        ? ?/sec
physical_window_function_partition_by_7_on_values     1.00    810.3±6.99µs        ? ?/sec    1.00    809.5±4.61µs        ? ?/sec
physical_window_function_partition_by_8_on_values     1.00    871.7±3.74µs        ? ?/sec    1.00    870.0±5.64µs        ? ?/sec
with_param_values_many_columns                        1.00    127.1±1.06µs        ? ?/sec    1.00    127.4±1.50µs        ? ?/sec

@alamb
Copy link
Contributor

alamb commented Nov 11, 2025

I am working up to reviewing this PR in detail

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.

Thank you very much for this PR @pepijnve

I think we could merge this code as is as it:

  1. Fixes the bug
  2. Is well commented and tested
  3. We don't have a realistic alternative despite trying pretty hard

I also ran the benchmarks in #17813 (comment) and am happy that this PR does not slow down planning measurably

However, as we have been discussing, I am worried that this PR introduces a substantial amount of additional code that is almost, but not quite, like existing features.

Anything you can do to help reduce the duplication would be most appreciated

Expr::IsNull(Box::new(expr))
}

/// Create is not null expression
Copy link
Contributor

Choose a reason for hiding this comment

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

this is a nice drive by cleanup

.collect::<Result<Vec<_>>>()?;
if then_nullable.contains(&true) {
Ok(true)
.filter_map(|(w, t)| {
Copy link
Contributor

Choose a reason for hiding this comment

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

This code is clear and easy to follow. Very nice

[dependencies]
arrow = { workspace = true }
async-trait = { workspace = true }
bitflags = "2.0.0"
Copy link
Contributor

Choose a reason for hiding this comment

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

This is already a dependency of arrow-schema

https://github.com/apache/arrow-rs/blob/a0db1985c3a0f3190cfc5166b428933a28c740f9/arrow-schema/Cargo.toml#L43

Thus while this is a new explicit dependency it is not a new-new dependency and thus I think it is fine to add


/// Checks if the change from `old` schema to `new` is allowed or not.
/// The current implementation only allows nullability of individual fields to change
/// from 'nullable' to 'not nullable'.
Copy link
Contributor

Choose a reason for hiding this comment

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

I think adding rationale about why would be helpful here as it may not be immediately obvious

Suggested change
/// from 'nullable' to 'not nullable'.
/// from 'nullable' to 'not nullable' (that is that the physical expression knows
/// more about its null-ness than its logical counterpart)

/// - `Some(true)` if the predicate evaluates to a truthy value.
/// - `Some(false)` if the predicate evaluates to a falsy value.
/// - `None` if the predicate could not be evaluated.
fn evaluate_predicate(predicate: &Arc<dyn PhysicalExpr>) -> Result<Option<bool>> {
Copy link
Contributor

Choose a reason for hiding this comment

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

as a follow on, I feel like this would be a more generally useful function as it is not specific to case.

Maybe we could add it in expression utils or something: https://github.com/apache/datafusion/blob/149d3e9533acadfb92329f5445d7deb72f6f679c/datafusion/physical-expr/src/utils/mod.rs#L268-L267

return Some(Ok(()));
}

// For branches with a nullable 'then' expression, try to determine
Copy link
Contributor

Choose a reason for hiding this comment

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

Also I found another related part of the code here:

///
/// Guarantees are a mapping from an expression (which currently is always a
/// column reference) to a [NullableInterval]. The interval represents the known
/// possible values of the column. Using these known values, expressions are
/// rewritten so they can be simplified using `ConstEvaluator` and `Simplifier`.
///
/// For example, if we know that a column is not null and has values in the
/// range [1, 10), we can rewrite `x IS NULL` to `false` or `x < 10` to `true`.
///
/// See a full example in [`ExprSimplifier::with_guarantees()`].
///
/// [`ExprSimplifier::with_guarantees()`]: crate::simplify_expressions::expr_simplifier::ExprSimplifier::with_guarantees
pub struct GuaranteeRewriter<'a> {
guarantees: HashMap<&'a Expr, &'a NullableInterval>,
}

This code seems to be simplifying the predicates based on nullability information.

I am not sure if we can reuse the other parts

Copy link
Contributor Author

Choose a reason for hiding this comment

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

That's actually what I'm investigating. I was thinking about moving that file over to expr-common and then rewriting using the when expression using a guarantee of then -> NullableInterval::Null. That would remove the need for the certainly_null_expr: Option<&Expr> argument.

The downside is that I then have to materialise the rewritten Expr where that's now done implicitly.

If you agree with the move to expr-common I can give this a go and then we can measure the planning impact.

Copy link
Contributor

Choose a reason for hiding this comment

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

sure -- it sounds reasonable but I can't really tell without actually seeing the code

certainly_null_expr: Option<&Expr>,
input_schema: &dyn ExprSchema,
) -> Result<NullableInterval> {
let evaluator = PredicateBoundsEvaluator {
Copy link
Contributor

Choose a reason for hiding this comment

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

Is your idea that you might be able to use the NullableInterval code instead of this (now that you have fixed the bugs?)

Copy link
Contributor Author

Choose a reason for hiding this comment

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

My idea was to see if I can remove TernarySet and use NullableInterval instead indeed. As I was trying to do so I stumbled upon the fact that the logical operators were broken.

The bitfield is much less 🤯 if you ask me, but it's silly to have multiple implementations of the same concept and using NullableInterval directly will get rid of the ugly translation block code.

@alamb
Copy link
Contributor

alamb commented Nov 11, 2025

🤖 ./gh_compare_branch_bench.sh Benchmark Script Running
Linux aal-dev 6.14.0-1018-gcp #19~24.04.1-Ubuntu SMP Wed Sep 24 23:23:09 UTC 2025 x86_64 x86_64 x86_64 GNU/Linux
Comparing issue_17801 (4b879e4) to e406689 diff
BENCH_NAME=aggregate_vectorized
BENCH_COMMAND=cargo bench --bench aggregate_vectorized
BENCH_FILTER=
BENCH_BRANCH_NAME=issue_17801
Results will be posted here when complete

@alamb
Copy link
Contributor

alamb commented Nov 11, 2025

🤖: Benchmark completed

Details

group                                                                                                             issue_17801                             main
-----                                                                                                             -----------                             ----
ByteViewGroupValueBuilder_vectorized_append/inline_null_0.0_size_1000/append_val                                  1.00      9.6±0.01µs        ? ?/sec     1.01      9.7±0.05µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/inline_null_0.0_size_1000/vectorized_append                           1.00      5.7±0.04µs        ? ?/sec     1.02      5.8±0.05µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/inline_null_0.0_size_1000/vectorized_equal_to_0.25 true               1.00      2.6±0.00µs        ? ?/sec     1.00      2.6±0.00µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/inline_null_0.0_size_1000/vectorized_equal_to_0.5 true                1.00      4.9±0.01µs        ? ?/sec     1.00      4.9±0.01µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/inline_null_0.0_size_1000/vectorized_equal_to_0.75 true               1.00      7.4±0.01µs        ? ?/sec     1.00      7.4±0.02µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/inline_null_0.0_size_1000/vectorized_equal_to_all_true                1.00      9.6±0.02µs        ? ?/sec     1.00      9.6±0.02µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/inline_null_0.0_size_10000/append_val                                 1.03     95.6±0.36µs        ? ?/sec     1.00     93.2±1.23µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/inline_null_0.0_size_10000/vectorized_append                          1.00     55.6±0.21µs        ? ?/sec     1.01     56.0±0.97µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/inline_null_0.0_size_10000/vectorized_equal_to_0.25 true              1.00     33.5±0.13µs        ? ?/sec     1.02     34.1±0.08µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/inline_null_0.0_size_10000/vectorized_equal_to_0.5 true               1.00     59.3±0.16µs        ? ?/sec     1.01     59.8±0.17µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/inline_null_0.0_size_10000/vectorized_equal_to_0.75 true              1.00     73.6±0.45µs        ? ?/sec     1.00     73.6±0.10µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/inline_null_0.0_size_10000/vectorized_equal_to_all_true               1.00     96.3±0.15µs        ? ?/sec     1.00     96.3±0.55µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/inline_null_0.0_size_100000/append_val                                1.00   1010.5±3.82µs        ? ?/sec     1.00  1006.9±10.86µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/inline_null_0.0_size_100000/vectorized_append                         1.00    615.4±3.01µs        ? ?/sec     1.04    639.8±1.58µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/inline_null_0.0_size_100000/vectorized_equal_to_0.25 true             1.00    391.8±3.75µs        ? ?/sec     1.01    394.6±3.69µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/inline_null_0.0_size_100000/vectorized_equal_to_0.5 true              1.00    642.0±3.36µs        ? ?/sec     1.02    652.8±5.78µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/inline_null_0.0_size_100000/vectorized_equal_to_0.75 true             1.00    748.5±2.59µs        ? ?/sec     1.00    750.7±4.10µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/inline_null_0.0_size_100000/vectorized_equal_to_all_true              1.00    971.9±3.30µs        ? ?/sec     1.00    971.4±1.84µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/inline_null_0.1_size_1000/append_val                                  1.00     12.6±0.03µs        ? ?/sec     1.05     13.2±0.04µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/inline_null_0.1_size_1000/vectorized_append                           1.04     14.1±0.04µs        ? ?/sec     1.00     13.7±0.06µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/inline_null_0.1_size_1000/vectorized_equal_to_0.25 true               1.00      2.8±0.01µs        ? ?/sec     1.00      2.8±0.00µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/inline_null_0.1_size_1000/vectorized_equal_to_0.5 true                1.00      5.4±0.01µs        ? ?/sec     1.00      5.4±0.01µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/inline_null_0.1_size_1000/vectorized_equal_to_0.75 true               1.00      8.2±0.03µs        ? ?/sec     1.00      8.2±0.02µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/inline_null_0.1_size_1000/vectorized_equal_to_all_true                1.00     10.7±0.02µs        ? ?/sec     1.00     10.7±0.01µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/inline_null_0.1_size_10000/append_val                                 1.00    126.4±0.77µs        ? ?/sec     1.02    128.6±0.36µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/inline_null_0.1_size_10000/vectorized_append                          1.05    139.4±0.33µs        ? ?/sec     1.00    132.6±0.43µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/inline_null_0.1_size_10000/vectorized_equal_to_0.25 true              1.00     37.3±0.39µs        ? ?/sec     1.00     37.4±0.15µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/inline_null_0.1_size_10000/vectorized_equal_to_0.5 true               1.01     71.8±0.53µs        ? ?/sec     1.00     71.3±0.36µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/inline_null_0.1_size_10000/vectorized_equal_to_0.75 true              1.00     84.7±0.24µs        ? ?/sec     1.00     84.6±0.23µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/inline_null_0.1_size_10000/vectorized_equal_to_all_true               1.00    106.8±0.15µs        ? ?/sec     1.00    106.9±0.49µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/inline_null_0.1_size_100000/append_val                                1.00  1339.8±23.13µs        ? ?/sec     1.02   1373.2±4.09µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/inline_null_0.1_size_100000/vectorized_append                         1.04   1471.1±6.50µs        ? ?/sec     1.00   1420.6±4.61µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/inline_null_0.1_size_100000/vectorized_equal_to_0.25 true             1.00    468.2±3.29µs        ? ?/sec     1.00    466.2±3.10µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/inline_null_0.1_size_100000/vectorized_equal_to_0.5 true              1.00    793.7±2.59µs        ? ?/sec     1.00    793.0±3.91µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/inline_null_0.1_size_100000/vectorized_equal_to_0.75 true             1.00    886.8±9.42µs        ? ?/sec     1.00    883.6±2.60µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/inline_null_0.1_size_100000/vectorized_equal_to_all_true              1.00   1081.9±4.96µs        ? ?/sec     1.00   1082.1±3.18µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/inline_null_0.5_size_1000/append_val                                  1.00     11.5±0.04µs        ? ?/sec     1.04     12.1±0.08µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/inline_null_0.5_size_1000/vectorized_append                           1.00     13.6±0.06µs        ? ?/sec     1.04     14.1±0.09µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/inline_null_0.5_size_1000/vectorized_equal_to_0.25 true               1.00   1919.4±7.40ns        ? ?/sec     1.00   1917.5±4.17ns        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/inline_null_0.5_size_1000/vectorized_equal_to_0.5 true                1.00      3.6±0.01µs        ? ?/sec     1.00      3.6±0.01µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/inline_null_0.5_size_1000/vectorized_equal_to_0.75 true               1.00      5.5±0.01µs        ? ?/sec     1.00      5.5±0.01µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/inline_null_0.5_size_1000/vectorized_equal_to_all_true                1.00      7.5±0.02µs        ? ?/sec     1.01      7.5±0.03µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/inline_null_0.5_size_10000/append_val                                 1.01    140.3±0.32µs        ? ?/sec     1.00    138.3±0.41µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/inline_null_0.5_size_10000/vectorized_append                          1.00    156.8±0.39µs        ? ?/sec     1.01    157.7±0.65µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/inline_null_0.5_size_10000/vectorized_equal_to_0.25 true              1.00     42.2±0.25µs        ? ?/sec     1.00     42.3±0.35µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/inline_null_0.5_size_10000/vectorized_equal_to_0.5 true               1.01     82.7±0.59µs        ? ?/sec     1.00     81.7±0.58µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/inline_null_0.5_size_10000/vectorized_equal_to_0.75 true              1.01     90.5±0.88µs        ? ?/sec     1.00     89.9±0.56µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/inline_null_0.5_size_10000/vectorized_equal_to_all_true               1.00     97.6±0.22µs        ? ?/sec     1.00     97.8±0.27µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/inline_null_0.5_size_100000/append_val                                1.00   1499.6±5.92µs        ? ?/sec     1.00   1495.3±8.18µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/inline_null_0.5_size_100000/vectorized_append                         1.00   1671.2±6.71µs        ? ?/sec     1.00   1668.9±4.97µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/inline_null_0.5_size_100000/vectorized_equal_to_0.25 true             1.00    522.4±3.03µs        ? ?/sec     1.00    520.4±4.88µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/inline_null_0.5_size_100000/vectorized_equal_to_0.5 true              1.00    905.2±3.27µs        ? ?/sec     1.00    904.8±2.60µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/inline_null_0.5_size_100000/vectorized_equal_to_0.75 true             1.00    982.0±3.43µs        ? ?/sec     1.00    977.4±3.07µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/inline_null_0.5_size_100000/vectorized_equal_to_all_true              1.00   1026.9±6.30µs        ? ?/sec     1.00  1026.2±17.11µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/random_null_0.0_size_1000/append_val                                  1.00     20.3±0.12µs        ? ?/sec     1.19     24.2±0.47µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/random_null_0.0_size_1000/vectorized_append                           1.00     16.3±0.19µs        ? ?/sec     1.22     19.9±0.44µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/random_null_0.0_size_1000/vectorized_equal_to_0.25 true               1.01      3.7±0.02µs        ? ?/sec     1.00      3.7±0.02µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/random_null_0.0_size_1000/vectorized_equal_to_0.5 true                1.01      6.5±0.05µs        ? ?/sec     1.00      6.4±0.06µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/random_null_0.0_size_1000/vectorized_equal_to_0.75 true               1.00      9.5±0.08µs        ? ?/sec     1.00      9.5±0.08µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/random_null_0.0_size_1000/vectorized_equal_to_all_true                1.00     12.9±0.07µs        ? ?/sec     1.01     13.0±0.06µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/random_null_0.0_size_10000/append_val                                 1.38    384.1±6.88µs        ? ?/sec     1.00    277.6±3.76µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/random_null_0.0_size_10000/vectorized_append                          1.43    362.5±5.01µs        ? ?/sec     1.00    253.6±0.92µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/random_null_0.0_size_10000/vectorized_equal_to_0.25 true              1.02     76.3±8.25µs        ? ?/sec     1.00     74.6±8.10µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/random_null_0.0_size_10000/vectorized_equal_to_0.5 true               1.00    127.7±6.64µs        ? ?/sec     1.01    128.5±7.34µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/random_null_0.0_size_10000/vectorized_equal_to_0.75 true              1.02    167.7±7.68µs        ? ?/sec     1.00   163.7±11.16µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/random_null_0.0_size_10000/vectorized_equal_to_all_true               1.09    186.3±8.25µs        ? ?/sec     1.00    171.3±2.19µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/random_null_0.0_size_100000/append_val                                1.00      4.4±0.11ms        ? ?/sec     3.15     14.0±0.24ms        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/random_null_0.0_size_100000/vectorized_append                         1.00      4.2±0.09ms        ? ?/sec     3.24     13.6±0.25ms        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/random_null_0.0_size_100000/vectorized_equal_to_0.25 true             1.00  1637.2±158.83µs        ? ?/sec    1.04  1701.9±162.43µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/random_null_0.0_size_100000/vectorized_equal_to_0.5 true              1.00      2.9±0.06ms        ? ?/sec     1.04      3.0±0.08ms        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/random_null_0.0_size_100000/vectorized_equal_to_0.75 true             1.03      3.3±0.07ms        ? ?/sec     1.00      3.2±0.07ms        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/random_null_0.0_size_100000/vectorized_equal_to_all_true              1.00      3.6±0.08ms        ? ?/sec     1.02      3.6±0.05ms        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/random_null_0.1_size_1000/append_val                                  1.00     20.8±0.21µs        ? ?/sec     1.16     24.2±0.39µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/random_null_0.1_size_1000/vectorized_append                           1.00     21.9±0.18µs        ? ?/sec     1.17     25.5±0.40µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/random_null_0.1_size_1000/vectorized_equal_to_0.25 true               1.01      3.7±0.01µs        ? ?/sec     1.00      3.6±0.01µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/random_null_0.1_size_1000/vectorized_equal_to_0.5 true                1.02      6.6±0.03µs        ? ?/sec     1.00      6.5±0.04µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/random_null_0.1_size_1000/vectorized_equal_to_0.75 true               1.01      9.6±0.13µs        ? ?/sec     1.00      9.5±0.11µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/random_null_0.1_size_1000/vectorized_equal_to_all_true                1.01     12.9±0.10µs        ? ?/sec     1.00     12.8±0.11µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/random_null_0.1_size_10000/append_val                                 1.37    402.2±5.18µs        ? ?/sec     1.00    292.6±3.21µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/random_null_0.1_size_10000/vectorized_append                          1.38    416.6±3.38µs        ? ?/sec     1.00    301.9±3.34µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/random_null_0.1_size_10000/vectorized_equal_to_0.25 true              1.00     76.6±7.30µs        ? ?/sec     1.06    81.5±10.83µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/random_null_0.1_size_10000/vectorized_equal_to_0.5 true               1.00    148.5±7.77µs        ? ?/sec     1.00    147.7±9.15µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/random_null_0.1_size_10000/vectorized_equal_to_0.75 true              1.00    162.9±5.50µs        ? ?/sec     1.00    163.4±5.14µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/random_null_0.1_size_10000/vectorized_equal_to_all_true               1.01    187.4±4.45µs        ? ?/sec     1.00    185.5±3.09µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/random_null_0.1_size_100000/append_val                                1.00      4.3±0.08ms        ? ?/sec     3.07     13.3±0.24ms        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/random_null_0.1_size_100000/vectorized_append                         1.00      4.6±0.10ms        ? ?/sec     2.79     12.7±0.22ms        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/random_null_0.1_size_100000/vectorized_equal_to_0.25 true             1.00  1591.2±140.35µs        ? ?/sec    1.02  1627.5±160.20µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/random_null_0.1_size_100000/vectorized_equal_to_0.5 true              1.03      2.8±0.06ms        ? ?/sec     1.00      2.8±0.07ms        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/random_null_0.1_size_100000/vectorized_equal_to_0.75 true             1.03      3.2±0.06ms        ? ?/sec     1.00      3.1±0.07ms        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/random_null_0.1_size_100000/vectorized_equal_to_all_true              1.00      3.4±0.05ms        ? ?/sec     1.00      3.4±0.06ms        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/random_null_0.5_size_1000/append_val                                  1.04     19.0±0.32µs        ? ?/sec     1.00     18.3±0.43µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/random_null_0.5_size_1000/vectorized_append                           1.00     20.0±0.28µs        ? ?/sec     1.03     20.6±0.38µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/random_null_0.5_size_1000/vectorized_equal_to_0.25 true               1.01      2.7±0.02µs        ? ?/sec     1.00      2.7±0.02µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/random_null_0.5_size_1000/vectorized_equal_to_0.5 true                1.01      4.7±0.03µs        ? ?/sec     1.00      4.7±0.03µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/random_null_0.5_size_1000/vectorized_equal_to_0.75 true               1.00      6.7±0.05µs        ? ?/sec     1.00      6.6±0.04µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/random_null_0.5_size_1000/vectorized_equal_to_all_true                1.01      8.6±0.12µs        ? ?/sec     1.00      8.5±0.10µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/random_null_0.5_size_10000/append_val                                 1.25    275.2±2.35µs        ? ?/sec     1.00    221.0±0.98µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/random_null_0.5_size_10000/vectorized_append                          1.27    303.3±2.51µs        ? ?/sec     1.00    238.1±1.04µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/random_null_0.5_size_10000/vectorized_equal_to_0.25 true              1.01     60.0±0.99µs        ? ?/sec     1.00     59.5±0.67µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/random_null_0.5_size_10000/vectorized_equal_to_0.5 true               1.01    117.3±1.86µs        ? ?/sec     1.00    116.2±0.89µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/random_null_0.5_size_10000/vectorized_equal_to_0.75 true              1.01    142.1±1.41µs        ? ?/sec     1.00    141.3±1.43µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/random_null_0.5_size_10000/vectorized_equal_to_all_true               1.01    158.9±1.21µs        ? ?/sec     1.00    158.1±1.43µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/random_null_0.5_size_100000/append_val                                1.00      3.0±0.09ms        ? ?/sec     2.70      8.1±0.16ms        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/random_null_0.5_size_100000/vectorized_append                         1.00      3.2±0.06ms        ? ?/sec     2.56      8.2±0.13ms        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/random_null_0.5_size_100000/vectorized_equal_to_0.25 true             1.02   911.5±42.31µs        ? ?/sec     1.00   897.5±39.03µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/random_null_0.5_size_100000/vectorized_equal_to_0.5 true              1.00  1657.5±88.23µs        ? ?/sec     1.00  1652.9±64.27µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/random_null_0.5_size_100000/vectorized_equal_to_0.75 true             1.00  1959.8±51.64µs        ? ?/sec     1.03      2.0±0.12ms        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/random_null_0.5_size_100000/vectorized_equal_to_all_true              1.00      2.1±0.05ms        ? ?/sec     1.00      2.1±0.04ms        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/scenario_null_0.0_size_1000/append_val                                1.01     18.2±0.07µs        ? ?/sec     1.00     18.1±0.13µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/scenario_null_0.0_size_1000/vectorized_append                         1.03     13.5±0.07µs        ? ?/sec     1.00     13.1±0.09µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/scenario_null_0.0_size_1000/vectorized_equal_to_0.25 true             1.01      2.4±0.03µs        ? ?/sec     1.00      2.4±0.03µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/scenario_null_0.0_size_1000/vectorized_equal_to_0.5 true              1.00      4.3±0.03µs        ? ?/sec     1.00      4.3±0.04µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/scenario_null_0.0_size_1000/vectorized_equal_to_0.75 true             1.00      6.4±0.03µs        ? ?/sec     1.00      6.4±0.02µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/scenario_null_0.0_size_1000/vectorized_equal_to_all_true              1.00      8.6±0.04µs        ? ?/sec     1.00      8.6±0.02µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/scenario_null_0.0_size_10000/append_val                               1.02    185.9±0.70µs        ? ?/sec     1.00    181.6±0.63µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/scenario_null_0.0_size_10000/vectorized_append                        1.00    151.1±0.69µs        ? ?/sec     1.06    160.6±0.93µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/scenario_null_0.0_size_10000/vectorized_equal_to_0.25 true            1.00     39.4±0.20µs        ? ?/sec     1.01     39.7±0.28µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/scenario_null_0.0_size_10000/vectorized_equal_to_0.5 true             1.00     71.6±0.32µs        ? ?/sec     1.01     72.1±0.36µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/scenario_null_0.0_size_10000/vectorized_equal_to_0.75 true            1.00     81.3±0.62µs        ? ?/sec     1.00     81.6±0.32µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/scenario_null_0.0_size_10000/vectorized_equal_to_all_true             1.00     94.1±0.27µs        ? ?/sec     1.00     94.1±0.51µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/scenario_null_0.0_size_100000/append_val                              1.09      2.1±0.03ms        ? ?/sec     1.00  1909.2±13.04µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/scenario_null_0.0_size_100000/vectorized_append                       1.12  1725.2±15.93µs        ? ?/sec     1.00  1542.6±11.73µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/scenario_null_0.0_size_100000/vectorized_equal_to_0.25 true           1.00    514.5±3.93µs        ? ?/sec     1.00    516.7±3.92µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/scenario_null_0.0_size_100000/vectorized_equal_to_0.5 true            1.00    819.5±3.75µs        ? ?/sec     1.01    829.1±3.99µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/scenario_null_0.0_size_100000/vectorized_equal_to_0.75 true           1.00    898.9±3.04µs        ? ?/sec     1.01    904.1±4.35µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/scenario_null_0.0_size_100000/vectorized_equal_to_all_true            1.00   1021.8±3.82µs        ? ?/sec     1.00   1024.1±3.81µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/scenario_null_0.1_size_1000/append_val                                1.04     19.2±0.04µs        ? ?/sec     1.00     18.5±0.03µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/scenario_null_0.1_size_1000/vectorized_append                         1.05     20.5±0.07µs        ? ?/sec     1.00     19.5±0.05µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/scenario_null_0.1_size_1000/vectorized_equal_to_0.25 true             1.01      2.8±0.02µs        ? ?/sec     1.00      2.8±0.01µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/scenario_null_0.1_size_1000/vectorized_equal_to_0.5 true              1.02      5.1±0.09µs        ? ?/sec     1.00      5.0±0.01µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/scenario_null_0.1_size_1000/vectorized_equal_to_0.75 true             1.01      7.4±0.05µs        ? ?/sec     1.00      7.3±0.03µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/scenario_null_0.1_size_1000/vectorized_equal_to_all_true              1.01      9.7±0.05µs        ? ?/sec     1.00      9.6±0.06µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/scenario_null_0.1_size_10000/append_val                               1.04    217.4±0.65µs        ? ?/sec     1.00    208.6±0.92µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/scenario_null_0.1_size_10000/vectorized_append                        1.07    234.3±0.95µs        ? ?/sec     1.00    218.7±0.50µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/scenario_null_0.1_size_10000/vectorized_equal_to_0.25 true            1.00     43.4±0.36µs        ? ?/sec     1.00     43.4±0.66µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/scenario_null_0.1_size_10000/vectorized_equal_to_0.5 true             1.00     83.1±0.50µs        ? ?/sec     1.00     82.9±0.49µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/scenario_null_0.1_size_10000/vectorized_equal_to_0.75 true            1.00     97.8±0.23µs        ? ?/sec     1.00     97.6±0.26µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/scenario_null_0.1_size_10000/vectorized_equal_to_all_true             1.00    111.3±0.30µs        ? ?/sec     1.00    111.6±0.39µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/scenario_null_0.1_size_100000/append_val                              1.10      2.4±0.02ms        ? ?/sec     1.00      2.2±0.01ms        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/scenario_null_0.1_size_100000/vectorized_append                       1.12      2.5±0.02ms        ? ?/sec     1.00      2.3±0.01ms        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/scenario_null_0.1_size_100000/vectorized_equal_to_0.25 true           1.00    579.6±5.04µs        ? ?/sec     1.01    586.4±3.33µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/scenario_null_0.1_size_100000/vectorized_equal_to_0.5 true            1.00    956.5±5.49µs        ? ?/sec     1.01    967.8±3.98µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/scenario_null_0.1_size_100000/vectorized_equal_to_0.75 true           1.00   1065.9±3.45µs        ? ?/sec     1.00   1069.9±3.94µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/scenario_null_0.1_size_100000/vectorized_equal_to_all_true            1.00   1186.0±6.72µs        ? ?/sec     1.01   1192.3±5.96µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/scenario_null_0.5_size_1000/append_val                                1.04     14.4±0.09µs        ? ?/sec     1.00     13.9±0.07µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/scenario_null_0.5_size_1000/vectorized_append                         1.00     16.4±0.14µs        ? ?/sec     1.01     16.5±0.10µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/scenario_null_0.5_size_1000/vectorized_equal_to_0.25 true             1.00   1948.7±9.71ns        ? ?/sec     1.00  1941.4±11.34ns        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/scenario_null_0.5_size_1000/vectorized_equal_to_0.5 true              1.00      3.5±0.01µs        ? ?/sec     1.00      3.5±0.01µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/scenario_null_0.5_size_1000/vectorized_equal_to_0.75 true             1.01      5.2±0.01µs        ? ?/sec     1.00      5.1±0.02µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/scenario_null_0.5_size_1000/vectorized_equal_to_all_true              1.01      6.7±0.03µs        ? ?/sec     1.00      6.7±0.04µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/scenario_null_0.5_size_10000/append_val                               1.02    189.9±0.90µs        ? ?/sec     1.00    186.5±0.42µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/scenario_null_0.5_size_10000/vectorized_append                        1.03    209.1±1.76µs        ? ?/sec     1.00    203.8±0.51µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/scenario_null_0.5_size_10000/vectorized_equal_to_0.25 true            1.01     46.8±0.50µs        ? ?/sec     1.00     46.3±0.34µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/scenario_null_0.5_size_10000/vectorized_equal_to_0.5 true             1.01     90.3±0.67µs        ? ?/sec     1.00     89.3±0.71µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/scenario_null_0.5_size_10000/vectorized_equal_to_0.75 true            1.01    103.5±0.65µs        ? ?/sec     1.00    102.2±0.60µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/scenario_null_0.5_size_10000/vectorized_equal_to_all_true             1.00    109.3±0.70µs        ? ?/sec     1.00    109.1±0.43µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/scenario_null_0.5_size_100000/append_val                              1.03      2.0±0.01ms        ? ?/sec     1.00   1941.8±6.01µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/scenario_null_0.5_size_100000/vectorized_append                       1.04      2.2±0.01ms        ? ?/sec     1.00      2.1±0.01ms        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/scenario_null_0.5_size_100000/vectorized_equal_to_0.25 true           1.00    588.1±2.62µs        ? ?/sec     1.00    587.5±2.53µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/scenario_null_0.5_size_100000/vectorized_equal_to_0.5 true            1.00   1004.4±3.68µs        ? ?/sec     1.00   1003.8±3.40µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/scenario_null_0.5_size_100000/vectorized_equal_to_0.75 true           1.00   1121.9±4.46µs        ? ?/sec     1.00   1118.4±4.63µs        ? ?/sec
ByteViewGroupValueBuilder_vectorized_append/scenario_null_0.5_size_100000/vectorized_equal_to_all_true            1.00   1194.6±4.17µs        ? ?/sec     1.00   1198.5±9.04µs        ? ?/sec
PrimitiveGroupValueBuilder_vectorized_append/null_0.0_nullable_false_size_1000/append_val                         1.00      3.6±0.03µs        ? ?/sec     1.18      4.3±0.02µs        ? ?/sec
PrimitiveGroupValueBuilder_vectorized_append/null_0.0_nullable_false_size_1000/vectorized_append                  1.00      2.1±0.00µs        ? ?/sec     1.02      2.1±0.00µs        ? ?/sec
PrimitiveGroupValueBuilder_vectorized_append/null_0.0_nullable_false_size_1000/vectorized_equal_to_0.25 true      1.37   830.7±25.06ns        ? ?/sec     1.00    605.3±6.91ns        ? ?/sec
PrimitiveGroupValueBuilder_vectorized_append/null_0.0_nullable_false_size_1000/vectorized_equal_to_0.5 true       1.19  1004.5±25.86ns        ? ?/sec     1.00    845.4±6.26ns        ? ?/sec
PrimitiveGroupValueBuilder_vectorized_append/null_0.0_nullable_false_size_1000/vectorized_equal_to_0.75 true      1.30  1433.5±36.00ns        ? ?/sec     1.00   1102.6±3.73ns        ? ?/sec
PrimitiveGroupValueBuilder_vectorized_append/null_0.0_nullable_false_size_1000/vectorized_equal_to_all_true       1.00   1382.2±2.44ns        ? ?/sec     1.00   1382.9±4.75ns        ? ?/sec
PrimitiveGroupValueBuilder_vectorized_append/null_0.0_nullable_false_size_10000/append_val                        1.00     32.1±0.18µs        ? ?/sec     1.28     41.2±0.13µs        ? ?/sec
PrimitiveGroupValueBuilder_vectorized_append/null_0.0_nullable_false_size_10000/vectorized_append                 1.01     17.0±0.19µs        ? ?/sec     1.00     16.9±0.17µs        ? ?/sec
PrimitiveGroupValueBuilder_vectorized_append/null_0.0_nullable_false_size_10000/vectorized_equal_to_0.25 true     1.13     23.9±0.14µs        ? ?/sec     1.00     21.1±0.10µs        ? ?/sec
PrimitiveGroupValueBuilder_vectorized_append/null_0.0_nullable_false_size_10000/vectorized_equal_to_0.5 true      1.04     35.5±0.18µs        ? ?/sec     1.00     34.3±0.18µs        ? ?/sec
PrimitiveGroupValueBuilder_vectorized_append/null_0.0_nullable_false_size_10000/vectorized_equal_to_0.75 true     1.18     26.3±0.05µs        ? ?/sec     1.00     22.2±0.12µs        ? ?/sec
PrimitiveGroupValueBuilder_vectorized_append/null_0.0_nullable_false_size_10000/vectorized_equal_to_all_true      1.00     13.6±0.12µs        ? ?/sec     1.00     13.6±0.04µs        ? ?/sec
PrimitiveGroupValueBuilder_vectorized_append/null_0.0_nullable_false_size_100000/append_val                       1.00    310.4±2.48µs        ? ?/sec     1.34    417.4±7.23µs        ? ?/sec
PrimitiveGroupValueBuilder_vectorized_append/null_0.0_nullable_false_size_100000/vectorized_append                1.00    161.0±0.65µs        ? ?/sec     1.07    172.8±0.71µs        ? ?/sec
PrimitiveGroupValueBuilder_vectorized_append/null_0.0_nullable_false_size_100000/vectorized_equal_to_0.25 true    1.01    267.5±0.86µs        ? ?/sec     1.00    265.4±0.79µs        ? ?/sec
PrimitiveGroupValueBuilder_vectorized_append/null_0.0_nullable_false_size_100000/vectorized_equal_to_0.5 true     1.00    411.9±1.43µs        ? ?/sec     1.00    411.2±1.70µs        ? ?/sec
PrimitiveGroupValueBuilder_vectorized_append/null_0.0_nullable_false_size_100000/vectorized_equal_to_0.75 true    1.01    292.4±0.79µs        ? ?/sec     1.00    290.8±0.85µs        ? ?/sec
PrimitiveGroupValueBuilder_vectorized_append/null_0.0_nullable_false_size_100000/vectorized_equal_to_all_true     1.00    138.5±0.32µs        ? ?/sec     1.00    138.7±0.43µs        ? ?/sec
PrimitiveGroupValueBuilder_vectorized_append/null_0.0_nullable_true_size_1000/append_val                          1.10      6.6±0.02µs        ? ?/sec     1.00      6.0±0.01µs        ? ?/sec
PrimitiveGroupValueBuilder_vectorized_append/null_0.0_nullable_true_size_1000/vectorized_append                   1.07      2.2±0.01µs        ? ?/sec     1.00      2.1±0.01µs        ? ?/sec
PrimitiveGroupValueBuilder_vectorized_append/null_0.0_nullable_true_size_1000/vectorized_equal_to_0.25 true       1.28    926.7±9.47ns        ? ?/sec     1.00    726.0±9.17ns        ? ?/sec
PrimitiveGroupValueBuilder_vectorized_append/null_0.0_nullable_true_size_1000/vectorized_equal_to_0.5 true        1.26  1269.8±13.23ns        ? ?/sec     1.00  1005.6±14.86ns        ? ?/sec
PrimitiveGroupValueBuilder_vectorized_append/null_0.0_nullable_true_size_1000/vectorized_equal_to_0.75 true       1.10  1497.7±17.49ns        ? ?/sec     1.00  1361.8±28.90ns        ? ?/sec
PrimitiveGroupValueBuilder_vectorized_append/null_0.0_nullable_true_size_1000/vectorized_equal_to_all_true        1.00   1659.5±2.86ns        ? ?/sec     1.00   1652.9±3.56ns        ? ?/sec
PrimitiveGroupValueBuilder_vectorized_append/null_0.0_nullable_true_size_10000/append_val                         1.10     62.1±0.21µs        ? ?/sec     1.00     56.4±0.83µs        ? ?/sec
PrimitiveGroupValueBuilder_vectorized_append/null_0.0_nullable_true_size_10000/vectorized_append                  1.11     18.6±0.16µs        ? ?/sec     1.00     16.7±0.19µs        ? ?/sec
PrimitiveGroupValueBuilder_vectorized_append/null_0.0_nullable_true_size_10000/vectorized_equal_to_0.25 true      1.00     20.0±0.31µs        ? ?/sec     1.22     24.4±0.06µs        ? ?/sec
PrimitiveGroupValueBuilder_vectorized_append/null_0.0_nullable_true_size_10000/vectorized_equal_to_0.5 true       1.00     39.3±0.41µs        ? ?/sec     1.00     39.2±0.15µs        ? ?/sec
PrimitiveGroupValueBuilder_vectorized_append/null_0.0_nullable_true_size_10000/vectorized_equal_to_0.75 true      1.00     28.1±0.10µs        ? ?/sec     1.05     29.4±0.16µs        ? ?/sec
PrimitiveGroupValueBuilder_vectorized_append/null_0.0_nullable_true_size_10000/vectorized_equal_to_all_true       1.00     16.4±0.03µs        ? ?/sec     1.00     16.4±0.14µs        ? ?/sec
PrimitiveGroupValueBuilder_vectorized_append/null_0.0_nullable_true_size_100000/append_val                        1.08    608.8±1.40µs        ? ?/sec     1.00    563.1±1.75µs        ? ?/sec
PrimitiveGroupValueBuilder_vectorized_append/null_0.0_nullable_true_size_100000/vectorized_append                 1.01    175.8±0.73µs        ? ?/sec     1.00    173.3±1.66µs        ? ?/sec
PrimitiveGroupValueBuilder_vectorized_append/null_0.0_nullable_true_size_100000/vectorized_equal_to_0.25 true     1.00    263.1±4.01µs        ? ?/sec     1.08    285.3±1.96µs        ? ?/sec
PrimitiveGroupValueBuilder_vectorized_append/null_0.0_nullable_true_size_100000/vectorized_equal_to_0.5 true      1.04    452.9±3.80µs        ? ?/sec     1.00    436.9±0.71µs        ? ?/sec
PrimitiveGroupValueBuilder_vectorized_append/null_0.0_nullable_true_size_100000/vectorized_equal_to_0.75 true     1.00    326.5±2.47µs        ? ?/sec     1.02    332.7±0.90µs        ? ?/sec
PrimitiveGroupValueBuilder_vectorized_append/null_0.0_nullable_true_size_100000/vectorized_equal_to_all_true      1.00    165.8±0.38µs        ? ?/sec     1.00    166.0±0.45µs        ? ?/sec
PrimitiveGroupValueBuilder_vectorized_append/null_0.1_nullable_true_size_1000/append_val                          1.05      8.5±0.01µs        ? ?/sec     1.00      8.1±0.01µs        ? ?/sec
PrimitiveGroupValueBuilder_vectorized_append/null_0.1_nullable_true_size_1000/vectorized_append                   1.03      7.9±0.02µs        ? ?/sec     1.00      7.7±0.01µs        ? ?/sec
PrimitiveGroupValueBuilder_vectorized_append/null_0.1_nullable_true_size_1000/vectorized_equal_to_0.25 true       1.19  1314.4±19.11ns        ? ?/sec     1.00   1102.9±8.98ns        ? ?/sec
PrimitiveGroupValueBuilder_vectorized_append/null_0.1_nullable_true_size_1000/vectorized_equal_to_0.5 true        1.16      2.2±0.02µs        ? ?/sec     1.00  1888.5±13.17ns        ? ?/sec
PrimitiveGroupValueBuilder_vectorized_append/null_0.1_nullable_true_size_1000/vectorized_equal_to_0.75 true       1.15      3.1±0.02µs        ? ?/sec     1.00      2.7±0.01µs        ? ?/sec
PrimitiveGroupValueBuilder_vectorized_append/null_0.1_nullable_true_size_1000/vectorized_equal_to_all_true        1.16      4.3±0.01µs        ? ?/sec     1.00      3.7±0.09µs        ? ?/sec
PrimitiveGroupValueBuilder_vectorized_append/null_0.1_nullable_true_size_10000/append_val                         1.03     83.3±0.27µs        ? ?/sec     1.00     80.8±1.05µs        ? ?/sec
PrimitiveGroupValueBuilder_vectorized_append/null_0.1_nullable_true_size_10000/vectorized_append                  1.03     77.6±0.35µs        ? ?/sec     1.00     75.4±0.23µs        ? ?/sec
PrimitiveGroupValueBuilder_vectorized_append/null_0.1_nullable_true_size_10000/vectorized_equal_to_0.25 true      1.01     28.6±0.23µs        ? ?/sec     1.00     28.3±0.17µs        ? ?/sec
PrimitiveGroupValueBuilder_vectorized_append/null_0.1_nullable_true_size_10000/vectorized_equal_to_0.5 true       1.09     57.2±0.26µs        ? ?/sec     1.00     52.5±0.20µs        ? ?/sec
PrimitiveGroupValueBuilder_vectorized_append/null_0.1_nullable_true_size_10000/vectorized_equal_to_0.75 true      1.09     51.0±0.32µs        ? ?/sec     1.00     46.7±0.19µs        ? ?/sec
PrimitiveGroupValueBuilder_vectorized_append/null_0.1_nullable_true_size_10000/vectorized_equal_to_all_true       1.13     46.2±0.10µs        ? ?/sec     1.00     40.9±0.07µs        ? ?/sec
PrimitiveGroupValueBuilder_vectorized_append/null_0.1_nullable_true_size_100000/append_val                        1.01    827.0±1.84µs        ? ?/sec     1.00    819.7±1.50µs        ? ?/sec
PrimitiveGroupValueBuilder_vectorized_append/null_0.1_nullable_true_size_100000/vectorized_append                 1.01    773.8±1.67µs        ? ?/sec     1.00    768.7±2.32µs        ? ?/sec
PrimitiveGroupValueBuilder_vectorized_append/null_0.1_nullable_true_size_100000/vectorized_equal_to_0.25 true     1.04    370.9±1.08µs        ? ?/sec     1.00    356.7±0.99µs        ? ?/sec
PrimitiveGroupValueBuilder_vectorized_append/null_0.1_nullable_true_size_100000/vectorized_equal_to_0.5 true      1.07    636.4±2.10µs        ? ?/sec     1.00    592.4±1.14µs        ? ?/sec
PrimitiveGroupValueBuilder_vectorized_append/null_0.1_nullable_true_size_100000/vectorized_equal_to_0.75 true     1.08   573.5±14.06µs        ? ?/sec     1.00    532.3±1.13µs        ? ?/sec
PrimitiveGroupValueBuilder_vectorized_append/null_0.1_nullable_true_size_100000/vectorized_equal_to_all_true      1.11    478.0±1.17µs        ? ?/sec     1.00    430.8±0.97µs        ? ?/sec
PrimitiveGroupValueBuilder_vectorized_append/null_0.5_nullable_true_size_1000/append_val                          1.00      7.9±0.07µs        ? ?/sec     1.04      8.2±0.06µs        ? ?/sec
PrimitiveGroupValueBuilder_vectorized_append/null_0.5_nullable_true_size_1000/vectorized_append                   1.05      8.5±0.04µs        ? ?/sec     1.00      8.1±0.05µs        ? ?/sec
PrimitiveGroupValueBuilder_vectorized_append/null_0.5_nullable_true_size_1000/vectorized_equal_to_0.25 true       1.23  1242.1±16.44ns        ? ?/sec     1.00   1008.8±4.67ns        ? ?/sec
PrimitiveGroupValueBuilder_vectorized_append/null_0.5_nullable_true_size_1000/vectorized_equal_to_0.5 true        1.18      2.0±0.02µs        ? ?/sec     1.00  1710.2±11.77ns        ? ?/sec
PrimitiveGroupValueBuilder_vectorized_append/null_0.5_nullable_true_size_1000/vectorized_equal_to_0.75 true       1.15      2.9±0.02µs        ? ?/sec     1.00      2.5±0.02µs        ? ?/sec
PrimitiveGroupValueBuilder_vectorized_append/null_0.5_nullable_true_size_1000/vectorized_equal_to_all_true        1.17      3.7±0.03µs        ? ?/sec     1.00      3.2±0.02µs        ? ?/sec
PrimitiveGroupValueBuilder_vectorized_append/null_0.5_nullable_true_size_10000/append_val                         1.00    113.5±0.36µs        ? ?/sec     1.03    116.4±0.85µs        ? ?/sec
PrimitiveGroupValueBuilder_vectorized_append/null_0.5_nullable_true_size_10000/vectorized_append                  1.05    122.9±0.33µs        ? ?/sec     1.00    117.4±0.85µs        ? ?/sec
PrimitiveGroupValueBuilder_vectorized_append/null_0.5_nullable_true_size_10000/vectorized_equal_to_0.25 true      1.00     33.7±0.21µs        ? ?/sec     1.00     33.6±0.14µs        ? ?/sec
PrimitiveGroupValueBuilder_vectorized_append/null_0.5_nullable_true_size_10000/vectorized_equal_to_0.5 true       1.07     67.1±0.44µs        ? ?/sec     1.00     62.9±0.27µs        ? ?/sec
PrimitiveGroupValueBuilder_vectorized_append/null_0.5_nullable_true_size_10000/vectorized_equal_to_0.75 true      1.08     68.6±0.33µs        ? ?/sec     1.00     63.2±0.31µs        ? ?/sec
PrimitiveGroupValueBuilder_vectorized_append/null_0.5_nullable_true_size_10000/vectorized_equal_to_all_true       1.10     66.1±0.32µs        ? ?/sec     1.00     60.1±0.26µs        ? ?/sec
PrimitiveGroupValueBuilder_vectorized_append/null_0.5_nullable_true_size_100000/append_val                        1.00   1163.4±4.02µs        ? ?/sec     1.02   1191.7±1.90µs        ? ?/sec
PrimitiveGroupValueBuilder_vectorized_append/null_0.5_nullable_true_size_100000/vectorized_append                 1.01   1243.7±2.93µs        ? ?/sec     1.00   1225.5±2.39µs        ? ?/sec
PrimitiveGroupValueBuilder_vectorized_append/null_0.5_nullable_true_size_100000/vectorized_equal_to_0.25 true     1.03    419.6±1.15µs        ? ?/sec     1.00    407.1±1.06µs        ? ?/sec
PrimitiveGroupValueBuilder_vectorized_append/null_0.5_nullable_true_size_100000/vectorized_equal_to_0.5 true      1.06    734.2±1.22µs        ? ?/sec     1.00    690.6±3.33µs        ? ?/sec
PrimitiveGroupValueBuilder_vectorized_append/null_0.5_nullable_true_size_100000/vectorized_equal_to_0.75 true     1.06    740.2±1.53µs        ? ?/sec     1.00    698.9±1.64µs        ? ?/sec
PrimitiveGroupValueBuilder_vectorized_append/null_0.5_nullable_true_size_100000/vectorized_equal_to_all_true      1.07    735.3±1.38µs        ? ?/sec     1.00    685.0±1.79µs        ? ?/sec

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

core Core DataFusion crate logical-expr Logical plan and expressions physical-expr Changes to the physical-expr crates sqllogictest SQL Logic Tests (.slt)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Regression: error planning TPC-DS query: input schema nullability mismatch

4 participants