@@ -148,12 +148,12 @@ use std::sync::Arc;
148148use super :: utils:: {
149149 convert_duration_type_to_interval, convert_interval_type_to_duration, get_inverse_op,
150150} ;
151- use crate :: expressions:: Literal ;
151+ use crate :: expressions:: { BinaryExpr , Literal } ;
152152use crate :: utils:: { build_dag, ExprTreeNode } ;
153153use crate :: PhysicalExpr ;
154154
155155use arrow:: datatypes:: { DataType , Schema } ;
156- use datafusion_common:: { internal_err, Result } ;
156+ use datafusion_common:: { internal_err, not_impl_err , Result } ;
157157use datafusion_expr:: interval_arithmetic:: { apply_operator, satisfy_greater, Interval } ;
158158use datafusion_expr:: Operator ;
159159
@@ -645,6 +645,17 @@ impl ExprIntervalGraph {
645645 . map ( |child| self . graph [ * child] . interval ( ) )
646646 . collect :: < Vec < _ > > ( ) ;
647647 let node_interval = self . graph [ node] . interval ( ) ;
648+ // Special case: true OR could in principle be propagated by 3 interval sets,
649+ // (i.e. left true, or right true, or both true) however we do not support this yet.
650+ if node_interval == & Interval :: CERTAINLY_TRUE
651+ && self . graph [ node]
652+ . expr
653+ . as_any ( )
654+ . downcast_ref :: < BinaryExpr > ( )
655+ . is_some_and ( |expr| expr. op ( ) == & Operator :: Or )
656+ {
657+ return not_impl_err ! ( "OR operator cannot yet propagate true intervals" ) ;
658+ }
648659 let propagated_intervals = self . graph [ node]
649660 . expr
650661 . propagate_constraints ( node_interval, & children_intervals) ?;
0 commit comments