@@ -160,10 +160,14 @@ impl<'a, T: NodeType, M: Memo<T>> TaskContext<'a, T, M> {
160160 continue ;
161161 }
162162 // Skip transformation rules when budget is used
163- if self . optimizer . ctx . logical_budget_used && !rule. is_impl_rule ( ) {
163+ if ( self . optimizer . ctx . logical_budget_used || self . optimizer . ctx . all_budget_used )
164+ && !rule. is_impl_rule ( )
165+ {
164166 continue ;
165167 }
166- if self . optimizer . ctx . all_budget_used {
168+ if self . optimizer . ctx . all_budget_used
169+ && self . optimizer . get_group_winner ( group_id) . has_full_winner ( )
170+ {
167171 break ;
168172 }
169173 if top_matches ( rule. matcher ( ) , expr. typ . clone ( ) ) {
@@ -246,7 +250,8 @@ impl<'a, T: NodeType, M: Memo<T>> TaskContext<'a, T, M> {
246250 let rule = self . optimizer . rules ( ) [ rule_id] . clone ( ) ;
247251
248252 let binding_exprs = match_and_pick_expr ( rule. matcher ( ) , expr_id, self . optimizer ) ;
249- if binding_exprs. len ( ) >= 100 {
253+ const BINDING_EXPR_WARNING_THRESHOLD : usize = 200 ;
254+ if binding_exprs. len ( ) >= BINDING_EXPR_WARNING_THRESHOLD {
250255 tracing:: warn!(
251256 event = "rule_application" ,
252257 task = "apply_rule" ,
@@ -302,12 +307,16 @@ impl<'a, T: NodeType, M: Memo<T>> TaskContext<'a, T, M> {
302307 }
303308 }
304309
305- if self . optimizer . ctx . all_budget_used {
306- break ;
307- }
308- if self . optimizer . ctx . logical_budget_used && !rule. is_impl_rule ( ) {
310+ if ( self . optimizer . ctx . logical_budget_used || self . optimizer . ctx . all_budget_used )
311+ && !rule. is_impl_rule ( )
312+ {
309313 continue ;
310314 }
315+ if self . optimizer . ctx . all_budget_used
316+ && self . optimizer . get_group_winner ( group_id) . has_full_winner ( )
317+ {
318+ break ;
319+ }
311320
312321 trace ! ( event = "before_apply_rule" , task = "apply_rule" , input_binding=%binding) ;
313322 let applied = rule. apply ( self . optimizer , binding) ;
@@ -540,7 +549,7 @@ impl<'a, T: NodeType, M: Memo<T>> TaskContext<'a, T, M> {
540549
541550 fn on_task_start ( & self ) {
542551 if ( self . optimizer . ctx . all_budget_used || self . optimizer . ctx . logical_budget_used )
543- && self . steps % 100 == 0
552+ && self . steps % 100000 == 0
544553 {
545554 println ! ( "out of budget, dumping info" ) ;
546555 println ! ( "step={}" , self . steps) ;
0 commit comments