47 lines
1.6 KiB
Go
47 lines
1.6 KiB
Go
// Copyright 2024 PingCAP, Inc.
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
|
|
package util
|
|
|
|
import (
|
|
"github.com/pingcap/tidb/pkg/expression"
|
|
)
|
|
|
|
// ResolveExprAndReplace replaces columns fields of expressions by children logical plans.
|
|
func ResolveExprAndReplace(origin expression.Expression, replace map[string]*expression.Column) {
|
|
switch expr := origin.(type) {
|
|
case *expression.Column:
|
|
ResolveColumnAndReplace(expr, replace)
|
|
case *expression.CorrelatedColumn:
|
|
ResolveColumnAndReplace(&expr.Column, replace)
|
|
case *expression.ScalarFunction:
|
|
for _, arg := range expr.GetArgs() {
|
|
ResolveExprAndReplace(arg, replace)
|
|
}
|
|
}
|
|
}
|
|
|
|
// ResolveColumnAndReplace replaces columns fields of expressions by children logical plans.
|
|
func ResolveColumnAndReplace(origin *expression.Column, replace map[string]*expression.Column) {
|
|
dst := replace[string(origin.HashCode())]
|
|
if dst != nil {
|
|
retType, inOperand := origin.RetType, origin.InOperand
|
|
*origin = *dst
|
|
origin.RetType, origin.InOperand = retType, inOperand
|
|
}
|
|
}
|
|
|
|
// SetPredicatePushDownFlag is a hook for other packages to set rule flag.
|
|
var SetPredicatePushDownFlag func(uint64) uint64
|