-
Type: Bug
-
Resolution: Fixed
-
Priority: Major - P3
-
Affects Version/s: None
-
Component/s: None
-
Labels:None
-
Query Optimization
-
Fully Compatible
-
ALL
-
QO 2023-01-09, QO 2023-01-23
Intersecting DNF intervals can sometimes lead to less strict bounds than expected. If we call intersectDNFIntervals with the following:
{ { {=Variable [a]} ^ {(Variable [b], Variable [c])} } }
The result** is
{ { [b >= a ? MaxKey : a, min(max(a,b), min(a,c))] } U { [max(max(a,b), min(a,c)), c <= a ? MinKey : a] } U { (max(a,b), min(a,c)) } }
If we have a=3, b=0, and c=3 then our original interval is [3,3] ^ (0, 3) = nothing. The result from intersectDNFIntervals is
{ { [3, 3] } U { nothing } U { nothing } }
which is [3,3]. This error seems to come from an auxiliary interval.
**
In reality the explain printed out is below, but its hard to read so I decoded it into min/max and ternary
{ { {[(If [] BinaryOp [Gte] Variable [b] Variable [a] Const [maxKey] Variable [a] ), (If [] BinaryOp [Lte] (If [] BinaryOp [Gte] Variable [a] Variable [b] Variable [a] Variable [b] ) (If [] BinaryOp [Lte] Variable [a] Variable [c] Variable [a] Variable [c] ) (If [] BinaryOp [Gte] Variable [a] Variable [b] Variable [a] Variable [b] ) (If [] BinaryOp [Lte] Variable [a] Variable [c] Variable [a] Variable [c] ) )]} } U { {[(If [] BinaryOp [Gte] (If [] BinaryOp [Gte] Variable [a] Variable [b] Variable [a] Variable [b] ) (If [] BinaryOp [Lte] Variable [a] Variable [c] Variable [a] Variable [c] ) (If [] BinaryOp [Gte] Variable [a] Variable [b] Variable [a] Variable [b] ) (If [] BinaryOp [Lte] Variable [a] Variable [c] Variable [a] Variable [c] ) ), (If [] BinaryOp [Lte] Variable [c] Variable [a] Const [minKey] Variable [a] )]} } U { {((If [] BinaryOp [Gte] Variable [a] Variable [b] Variable [a] Variable [b] ), (If [] BinaryOp [Lte] Variable [a] Variable [c] Variable [a] Variable [c] ))} } }