Skip to content

fix: reject non-boolean filter/join conditions at build time - #271

Merged
andrew-coleman merged 1 commit into
substrait-io:mainfrom
thgschwind:fix/boolean-join-filter-condition
Sep 10, 2026
Merged

fix: reject non-boolean filter/join conditions at build time#271
andrew-coleman merged 1 commit into
substrait-io:mainfrom
thgschwind:fix/boolean-join-filter-condition

Conversation

@thgschwind

Copy link
Copy Markdown
Contributor

Substrait requires a FilterRel/JoinRel condition to be a boolean predicate, but resolve_expression allows to bind any expression, including a bare column reference. This creates a legit-looking plan that lloks like the pandas on="key" idiom but essentially generates a Cartesian product which on large tables appears to hang due to the data it has to process.

Add _require_boolean_condition, which infers the bound condition's type and raises if it is not a boolean, wired into filter, join, nested_loop_join, and lateral_join. The join builders add a hint pointing at the equi-join idiom (col('a') == col('b')) and cross_join.

Fixes #270

Substrait requires a FilterRel/JoinRel condition to be a boolean
predicate, but resolve_expression allows to bind any expression,
including a bare column reference. This creates a legit-looking
plan that lloks like the pandas `on="key"` idiom but essentially
generates a Cartesian product which on large tables appears to
hang due to the data it has to process.

Add _require_boolean_condition, which infers the bound condition's
type and raises if it is not boolean, wired into filter, join,
nested_loop_join, and lateral_join. The join builders add a hint
pointing at the equi-join idiom (col('a') == col('b')) and cross_join.

Signed-off-by: Thomas Gschwind <thg@zurich.ibm.com>
@andrew-coleman
andrew-coleman merged commit e001537 into substrait-io:main Sep 10, 2026
21 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

join accept a non-boolean join condition generating unexpected output

2 participants