Documentation ¶
Index ¶
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func EncodeJSONCommon ¶
EncodeJSONCommon contains some common logic for the debug trace, like disabling EscapeHTML and recording error.
func EnterContextCommon ¶
func EnterContextCommon(sctx sessionctx.Context)
EnterContextCommon records the function name of the caller, then creates and enter a new context for this debug trace structure.
func LeaveContextCommon ¶
func LeaveContextCommon(sctx sessionctx.Context)
LeaveContextCommon makes the debug trace goes to its parent context.
func RecordAnyValuesWithNames ¶
func RecordAnyValuesWithNames( s sessionctx.Context, vals ...interface{}, )
RecordAnyValuesWithNames is a general debug trace logic for recording some values of any type with a name. The vals arguments should be a slice like ["name1", value1, "name2", value2]. The names must be string, the values can be any type.
Types ¶
type OptimizerDebugTraceRoot ¶
type OptimizerDebugTraceRoot struct {
// contains filtered or unexported fields
}
OptimizerDebugTraceRoot is for recording the optimizer debug trace. Each debug information, which is a "step" and can be any type, is placed in a "context" (baseDebugTraceContext) as an interface{}. Overall, the debug trace is a tree-like hierarchical structure of baseDebugTraceContext. This structure can reflect the function call hierarchy of each step during optimization. In the end, the entire recorded baseDebugTraceContext will be marshalled to JSON as the result.
EnterContextCommon and LeaveContextCommon can be used to maintain the context easily. Usually you just need to add the code below at the beginning of a function:
if StmtCtx.EnableOptimizerDebugTrace { EnterContextCommon(ds.ctx) defer LeaveContextCommon(ds.ctx) }
To record debug information, AppendStepToCurrentContext and AppendStepWithNameToCurrentContext are provided as low-level methods. RecordAnyValuesWithNames handles some common logic for better usability, so it should be the most commonly used function for recording simple information. If the tracing logic is more complicated or need extra MarshalJSON logic, you should implement separate logic like in planner/core/debug_trace.go and statistics/debug_trace.go
func GetOrInitDebugTraceRoot ¶
func GetOrInitDebugTraceRoot(sctx sessionctx.Context) *OptimizerDebugTraceRoot
GetOrInitDebugTraceRoot returns the debug trace root. If it's not initialized, it will initialize it first.
func (*OptimizerDebugTraceRoot) AppendStepToCurrentContext ¶
func (root *OptimizerDebugTraceRoot) AppendStepToCurrentContext(step interface{})
AppendStepToCurrentContext records debug information to the current context of the debug trace.
func (*OptimizerDebugTraceRoot) AppendStepWithNameToCurrentContext ¶
func (root *OptimizerDebugTraceRoot) AppendStepWithNameToCurrentContext(step interface{}, name string)
AppendStepWithNameToCurrentContext records debug information and a name to the current context of the debug trace.
func (*OptimizerDebugTraceRoot) MarshalJSON ¶
func (root *OptimizerDebugTraceRoot) MarshalJSON() ([]byte, error)
MarshalJSON overrides the default MarshalJSON behavior and marshals the unexported traceCtx.