Skip to content

Commit 04e5ff9

Browse files
authored
expression: expose the optional property on EvaluatorSuit (#54798)
close #54797
1 parent d0c73aa commit 04e5ff9

File tree

2 files changed

+77
-0
lines changed

2 files changed

+77
-0
lines changed

pkg/expression/evaluator.go

+25
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
package expression
1616

1717
import (
18+
"github.com/pingcap/tidb/pkg/expression/context"
1819
"github.com/pingcap/tidb/pkg/util/chunk"
1920
)
2021

@@ -74,6 +75,30 @@ func (e *defaultEvaluator) run(ctx EvalContext, vecEnabled bool, input, output *
7475
return nil
7576
}
7677

78+
// RequiredOptionalEvalProps exposes all optional evaluation properties that this evaluator requires.
79+
func (e *defaultEvaluator) RequiredOptionalEvalProps() context.OptionalEvalPropKeySet {
80+
props := context.OptionalEvalPropKeySet(0)
81+
for _, expr := range e.exprs {
82+
props = props | getOptionalEvalPropsForExpr(expr)
83+
}
84+
85+
return props
86+
}
87+
88+
func getOptionalEvalPropsForExpr(expr Expression) context.OptionalEvalPropKeySet {
89+
switch e := expr.(type) {
90+
case *ScalarFunction:
91+
props := e.Function.RequiredOptionalEvalProps()
92+
for _, arg := range e.GetArgs() {
93+
props = props | getOptionalEvalPropsForExpr(arg)
94+
}
95+
96+
return props
97+
default:
98+
return 0
99+
}
100+
}
101+
77102
// EvaluatorSuite is responsible for the evaluation of a list of expressions.
78103
// It separates them to "column" and "other" expressions and evaluates "other"
79104
// expressions before "column" expressions.

pkg/expression/evaluator_test.go

+52
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,10 @@ import (
1919
"time"
2020

2121
"github.com/pingcap/tidb/pkg/errctx"
22+
"github.com/pingcap/tidb/pkg/expression/context"
2223
"github.com/pingcap/tidb/pkg/parser/ast"
2324
"github.com/pingcap/tidb/pkg/parser/charset"
25+
"github.com/pingcap/tidb/pkg/parser/model"
2426
"github.com/pingcap/tidb/pkg/parser/mysql"
2527
"github.com/pingcap/tidb/pkg/types"
2628
"github.com/pingcap/tidb/pkg/util/chunk"
@@ -606,3 +608,53 @@ func TestMod(t *testing.T) {
606608
require.NoError(t, err)
607609
require.Equal(t, types.NewDatum(1.5), r)
608610
}
611+
612+
func TestOptionalProp(t *testing.T) {
613+
ctx := createContext(t)
614+
615+
fc := funcs[ast.Plus]
616+
arg1fc := funcs[ast.CurrentUser]
617+
arg1f, err := arg1fc.getFunction(ctx, nil)
618+
require.NoError(t, err)
619+
arg1 := &ScalarFunction{
620+
FuncName: model.NewCIStr(ast.CurrentUser),
621+
Function: arg1f,
622+
RetType: arg1f.getRetTp(),
623+
}
624+
arg2fc := funcs[ast.TiDBIsDDLOwner]
625+
arg2f, err := arg2fc.getFunction(ctx, nil)
626+
require.NoError(t, err)
627+
arg2 := &ScalarFunction{
628+
FuncName: model.NewCIStr(ast.TiDBIsDDLOwner),
629+
Function: arg2f,
630+
RetType: arg2f.getRetTp(),
631+
}
632+
633+
f, err := fc.getFunction(ctx, []Expression{arg1, arg2})
634+
require.NoError(t, err)
635+
fe := &ScalarFunction{
636+
FuncName: model.NewCIStr(ast.Plus),
637+
Function: f,
638+
RetType: f.getRetTp(),
639+
}
640+
641+
fc2 := funcs[ast.GetLock]
642+
f2, err := fc2.getFunction(ctx, datumsToConstants(types.MakeDatums("tidb_distsql_scan_concurrency", 10)))
643+
require.NoError(t, err)
644+
fe2 := &ScalarFunction{
645+
FuncName: model.NewCIStr(ast.GetLock),
646+
Function: f2,
647+
RetType: f2.getRetTp(),
648+
}
649+
650+
require.Equal(t, context.OptionalEvalPropKeySet(0), f.RequiredOptionalEvalProps())
651+
require.Equal(t, context.OptPropCurrentUser.AsPropKeySet()|context.OptPropDDLOwnerInfo.AsPropKeySet(),
652+
getOptionalEvalPropsForExpr(fe))
653+
require.Equal(t, context.OptPropCurrentUser.AsPropKeySet()|context.OptPropDDLOwnerInfo.AsPropKeySet()|
654+
context.OptPropAdvisoryLock.AsPropKeySet(),
655+
getOptionalEvalPropsForExpr(fe)|getOptionalEvalPropsForExpr(fe2))
656+
657+
evalSuit := NewEvaluatorSuite([]Expression{fe, fe2}, false)
658+
require.Equal(t, context.OptPropCurrentUser.AsPropKeySet()|context.OptPropDDLOwnerInfo.AsPropKeySet()|
659+
context.OptPropAdvisoryLock.AsPropKeySet(), evalSuit.RequiredOptionalEvalProps())
660+
}

0 commit comments

Comments
 (0)