Skip to content

Commit 038416e

Browse files
author
James Cor
committed
add case for null safe equals
1 parent a03f2a4 commit 038416e

2 files changed

Lines changed: 27 additions & 4 deletions

File tree

sql/analyzer/costed_index_scan.go

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1712,9 +1712,11 @@ func (c *indexCoster) transformForIndexCosting(ctx *sql.Context, expr sql.Expres
17121712
var ok bool
17131713
switch e := e.(type) {
17141714
case *expression.InTuple, *expression.HashInTuple:
1715-
newExpr, ok = c.transformInTupleForIndexCosting(leftTuple, rightTuple)
1715+
newExpr, ok = c.transformInTupleForIndexCosting(leftTuple, rightTuple, false)
17161716
case *expression.Equals:
1717-
newExpr, ok = c.transformInTupleForIndexCosting(leftTuple, expression.NewTuple(rightTuple))
1717+
newExpr, ok = c.transformInTupleForIndexCosting(leftTuple, expression.NewTuple(rightTuple), false)
1718+
case *expression.NullSafeEquals:
1719+
newExpr, ok = c.transformInTupleForIndexCosting(leftTuple, expression.NewTuple(rightTuple), true)
17181720
case *expression.LessThan:
17191721
newExpr, ok = c.transformLessThanTupleForIndexCosting(leftTuple, rightTuple)
17201722
case *expression.LessThanOrEqual:
@@ -1734,7 +1736,7 @@ func (c *indexCoster) transformForIndexCosting(ctx *sql.Context, expr sql.Expres
17341736
return transformedExpr
17351737
}
17361738

1737-
func (c *indexCoster) transformInTupleForIndexCosting(leftTuple, rightTuples expression.Tuple) (sql.Expression, bool) {
1739+
func (c *indexCoster) transformInTupleForIndexCosting(leftTuple, rightTuples expression.Tuple, nullSafe bool) (sql.Expression, bool) {
17381740
n := len(leftTuple)
17391741
if len(rightTuples) == 0 && n > 0 {
17401742
return expression.NewLiteral(false, types.Boolean), true
@@ -1748,7 +1750,11 @@ func (c *indexCoster) transformInTupleForIndexCosting(leftTuple, rightTuples exp
17481750
// Build AND of equals: col1 = v1 AND col2 = v2 AND ...
17491751
andExprs := make([]sql.Expression, n)
17501752
for j := 0; j < n; j++ {
1751-
andExprs[j] = expression.NewEquals(leftTuple[j], rightTuple[j])
1753+
if nullSafe {
1754+
andExprs[j] = expression.NewNullSafeEquals(leftTuple[j], rightTuple[j])
1755+
} else {
1756+
andExprs[j] = expression.NewEquals(leftTuple[j], rightTuple[j])
1757+
}
17521758
}
17531759
orExprs[i] = expression.JoinAnd(andExprs...)
17541760
}

sql/analyzer/costed_index_scan_test.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -297,6 +297,23 @@ Or
297297
(3: xy.y = 6))`,
298298
leftover: "",
299299
},
300+
{
301+
name: "tuple null safe equals decomposes to ANDs",
302+
in: expression.NewNullSafeEquals(
303+
expression.Tuple{
304+
gf(0, "xy", "x"),
305+
gf(1, "xy", "y")},
306+
expression.Tuple{
307+
lit(5),
308+
lit(6),
309+
},
310+
),
311+
exp: `
312+
(1: and
313+
(2: xy.x <=> 5)
314+
(3: xy.y <=> 6))`,
315+
leftover: "",
316+
},
300317
{
301318
name: "tuple less than decomposes to ORs of ANDs",
302319
in: expression.NewLessThan(

0 commit comments

Comments
 (0)