@@ -182,6 +182,16 @@ func getPotentialEqOrInColOffset(sctx *rangerctx.RangerContext, expr expression.
182
182
return i
183
183
}
184
184
}
185
+ case ast .IsNull :
186
+ c , ok := f .GetArgs ()[0 ].(* expression.Column )
187
+ if ! ok {
188
+ return - 1
189
+ }
190
+ for i , col := range cols {
191
+ if col .EqualColumn (c ) {
192
+ return i
193
+ }
194
+ }
185
195
}
186
196
return - 1
187
197
}
@@ -635,27 +645,34 @@ func allEqOrIn(expr expression.Expression) bool {
635
645
}
636
646
}
637
647
return true
638
- case ast .EQ , ast .NullEQ , ast .In :
648
+ case ast .EQ , ast .NullEQ , ast .In , ast . IsNull :
639
649
return true
640
650
}
641
651
return false
642
652
}
643
653
644
654
func extractValueInfo (expr expression.Expression ) * valueInfo {
645
- if f , ok := expr .(* expression.ScalarFunction ); ok && (f .FuncName .L == ast .EQ || f .FuncName .L == ast .NullEQ ) {
646
- getValueInfo := func (c * expression.Constant ) * valueInfo {
647
- mutable := c .ParamMarker != nil || c .DeferredExpr != nil
648
- var value * types.Datum
649
- if ! mutable {
650
- value = & c .Value
655
+ if f , ok := expr .(* expression.ScalarFunction ); ok {
656
+ if f .FuncName .L == ast .IsNull {
657
+ val := & types.Datum {}
658
+ val .SetNull ()
659
+ return & valueInfo {value : val , mutable : false }
660
+ }
661
+ if f .FuncName .L == ast .EQ || f .FuncName .L == ast .NullEQ {
662
+ getValueInfo := func (c * expression.Constant ) * valueInfo {
663
+ mutable := c .ParamMarker != nil || c .DeferredExpr != nil
664
+ var value * types.Datum
665
+ if ! mutable {
666
+ value = & c .Value
667
+ }
668
+ return & valueInfo {value , mutable }
669
+ }
670
+ if c , ok := f .GetArgs ()[0 ].(* expression.Constant ); ok {
671
+ return getValueInfo (c )
672
+ }
673
+ if c , ok := f .GetArgs ()[1 ].(* expression.Constant ); ok {
674
+ return getValueInfo (c )
651
675
}
652
- return & valueInfo {value , mutable }
653
- }
654
- if c , ok := f .GetArgs ()[0 ].(* expression.Constant ); ok {
655
- return getValueInfo (c )
656
- }
657
- if c , ok := f .GetArgs ()[1 ].(* expression.Constant ); ok {
658
- return getValueInfo (c )
659
676
}
660
677
}
661
678
return nil
@@ -714,8 +731,12 @@ func ExtractEqAndInCondition(sctx *rangerctx.RangerContext, conditions []express
714
731
if ma == nil {
715
732
if accesses [i ] != nil {
716
733
if allEqOrIn (accesses [i ]) {
717
- newConditions = append (newConditions , accesses [i ])
718
734
columnValues [i ] = extractValueInfo (accesses [i ])
735
+ if columnValues [i ] != nil && columnValues [i ].value != nil && columnValues [i ].value .IsNull () {
736
+ accesses [i ] = nil
737
+ } else {
738
+ newConditions = append (newConditions , accesses [i ])
739
+ }
719
740
} else {
720
741
accesses [i ] = nil
721
742
}
0 commit comments