executor

package
v1.2.6 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jul 29, 2026 License: AGPL-3.0 Imports: 22 Imported by: 0

Documentation

Overview

agg.go 实现聚合算子 AggOp(GROUP BY + COUNT/SUM/AVG/MAX/MIN + HAVING)

analyze.go ANALYZE TABLE 算子——采集列级统计信息和直方图(OPT-1)

build.go 将 PhysicalPlan 组装为 Operator 执行树

coerce.go 写入前的类型强制转换。 INSERT/UPDATE 的列值在 Eval 之后、encoder 编码之前经过此层, 将字符串、float64 等外部类型按目标列类型转为存储所需的 Go 类型。

count_stats.go — COUNT(*) fast path: read from TableStats, fall back to table scan.

ddl.go CreateTable/DropTable/CreateIndex/DropIndex 算子

delete.go Delete 算子:删除子算子输出的所有行

distinct.go SELECT DISTINCT 去重算子

dual.go DualScan 算子:产生一行空行(用于 SELECT expr 无 FROM 场景)

evaluator.go 表达式求值器(对 Row 中的一行数据进行求值)

Package executor 实现 VDS SQL 层的 Volcano 模型执行器。

每个算子实现 Operator 接口(Open/Next/Close),组成执行树。 执行树由 planner.PhysicalPlan 直接映射而来(M1 无规则重写)。

explain.go EXPLAIN 算子:渲染物理计划树为文本行

filter.go Filter 算子:对子算子的输出按谓词过滤

fk.go FOREIGN KEY 引用完整性检查(完整实现)。 支持:INSERT/UPDATE 子表检查、DELETE/UPDATE 父表检查、

ON DELETE/UPDATE CASCADE/SET NULL/RESTRICT、
多列复合 FK、引用 UNIQUE 索引列(不仅限于 PK)。

funcs.go 内置函数注册表与求值器 — 字符串函数 / CASE WHEN

index_maint.go 二级索引维护辅助函数(INSERT/UPDATE/DELETE 时调用)

index_scan.go IndexScan 算子:扫描二级索引区间,回表读完整行(或覆盖索引直接返回)

insert.go Insert 算子:写入单行数据

join.go 实现 Nested Loop Join 算子(支持 INNER / LEFT OUTER / RIGHT OUTER)

json_funcs.go JSON 类型辅助函数:序列化、路径提取、类型判断

metadata.go 元数据查询算子:SHOW TABLES / SHOW COLUMNS / INFORMATION_SCHEMA 虚拟扫描

multi_get.go MultiGetOp 算子——IN 子句多点查优化(OPT-2)

partial_index.go 部分索引运行时过滤:MatchIndexFilter 供 index_maint 使用

project.go Project 算子:按投影表达式列表重写输出行

savepoint.go SAVEPOINT / ROLLBACK TO / RELEASE 算子

scan.go TableScan 算子:支持全表扫描、点查和范围扫描,逐行解码为 Row

setop.go UNION / INTERSECT / EXCEPT 集合运算算子

P2-SQ-15:优化方向说明 ——

当前实现将左右子查询全量物化到内存后用 hash-set 合并。
一个更成熟的优化方向是:
  - 若两侧均为独立的全表扫描 / 索引扫描,可用 goroutine 并行收集行;
  - 对于 ORDER BY + LIMIT 场景,可实现流式合并(merge-join 变体)避免全量物化。
当前仅实现了最基础的并行收集优化(见 materialize 中的 go-func 并发)。

sort.go 实现 ORDER BY 排序算子(SortOp)和 LIMIT/OFFSET 截断算子(LimitOp)

subquery.go 子查询求值器:标量子查询 / IN (SELECT) / EXISTS (SELECT)

update.go Update 算子:按子算子输出的行集批量更新

vm.go — 表达式字节码虚拟机(M2)

Index

Constants

View Source
const MaxSortRows = 1000000

MaxSortRows 排序算子允许的最大行数(M-SQL-3 修复:防止恶意 ORDER BY 导致内存溢出) 可通过配置项覆盖,默认 1000000 行(约 100MB,假设每行 100 字节)

Variables

This section is empty.

Functions

func CheckConstraints added in v1.1.6

func CheckConstraints(row []types.Value, table *catalog.TableDesc) error

CheckConstraints 对一行值校验 CHECK 约束表达式。 table.CheckExprs 中存储的是 expr.Expression(以 interface{} 包装)。 返回第一个失败的约束错误,全部通过返回 nil。

func CoerceAssignments added in v1.1.1

func CoerceAssignments(assignments map[int]types.Value, table *catalog.TableDesc) error

CoerceAssignments 将 UPDATE SET 赋值结果按目标列类型强制转换,并校验 NOT NULL 约束。 assignments 为 colIndex → value 的映射,原地修改。

func CoerceRow added in v1.1.1

func CoerceRow(row []types.Value, table *catalog.TableDesc) error

CoerceRow 将一行值按目标表列类型做强制转换,并校验 NOT NULL 约束。 仅转换类型不匹配但语义兼容的情况(如字符串 → Timestamp int64)。 原地修改 row,若转换失败或违反非空约束则返回错误。

func Eval

func Eval(e expr.Expression, row Row, params []interface{}, ctx ...*ExecContext) (retVal interface{}, retErr error)

Eval 对 row 求值一个表达式,返回 Go 原生值。 params 为 SQL 占位符 ? 的绑定值(M2 新增,可为 nil)。 ctx 为可选的执行上下文,子查询求值时需要(其他情况传 nil 或省略)。 比较操作返回 bool;NULL 传播:任何操作数为 nil 时返回 nil。 内置 panic 恢复:表达式求值中可能发生除零、类型断言等 panic,统一转为 error 返回。

func ExecVM

func ExecVM(prog *VMProgram, row Row, params []interface{}) (interface{}, error)

func MatchIndexFilter added in v1.1.6

func MatchIndexFilter(idx catalog.IndexDesc, row Row, params []interface{}) bool

MatchIndexFilter 判断给定行是否满足部分索引的过滤条件。 若索引没有 WhereFilter(全量索引),则始终返回 true。

Types

type AggOp

type AggOp struct {
	// contains filtered or unexported fields
}

AggOp 聚合算子:一次性拉取全部输入行,按 GroupBys 分组,计算聚合值

func NewAggOp

func NewAggOp(child Operator, plan *planner.PhysicalAgg, params []interface{}, namedParams ...map[string]interface{}) *AggOp

NewAggOp 创建 AggOp。namedParams 为可选命名参数(P2-SQ-07)。

func (*AggOp) Close

func (op *AggOp) Close() error

func (*AggOp) Next

func (op *AggOp) Next() (Row, *planner.Schema, error)

func (*AggOp) Open

func (op *AggOp) Open() error

type AlterTableOp added in v1.1.6

type AlterTableOp struct {
	// contains filtered or unexported fields
}

AlterTableOp ALTER TABLE 算子(ADD/DROP COLUMN)

func NewAlterTableOp added in v1.1.6

func NewAlterTableOp(txn engine.Transaction, cat *catalog.Catalog, plan *planner.PhysicalAlterTable) *AlterTableOp

NewAlterTableOp 创建 AlterTable 算子

func (*AlterTableOp) Close added in v1.1.6

func (op *AlterTableOp) Close() error

func (*AlterTableOp) Next added in v1.1.6

func (op *AlterTableOp) Next() (Row, *planner.Schema, error)

func (*AlterTableOp) Open added in v1.1.6

func (op *AlterTableOp) Open() error

type AnalyzeOp

type AnalyzeOp struct {
	// contains filtered or unexported fields
}

AnalyzeOp ANALYZE TABLE 算子:扫描全表,计算每列的 NDV/Min/Max/NullCount。

func NewAnalyzeOp

func NewAnalyzeOp(txn engine.Transaction, cat *catalog.Catalog, plan *planner.PhysicalAnalyze) *AnalyzeOp

NewAnalyzeOp 创建 ANALYZE 算子

func (*AnalyzeOp) Close

func (op *AnalyzeOp) Close() error

Close 释放资源

func (*AnalyzeOp) Next

func (op *AnalyzeOp) Next() (Row, *planner.Schema, error)

Next 执行全表扫描统计(仅调用一次),返回单行结果。

func (*AnalyzeOp) Open

func (op *AnalyzeOp) Open() error

Open 获取表描述符并启动扫描

type CountStatsOp

type CountStatsOp struct {
	// contains filtered or unexported fields
}

CountStatsOp COUNT(*) 快速路径算子。 优先从内存统计缓存读取行数;缓存未命中时从磁盘加载; 磁盘也无数据时回退到全表扫描。

func (*CountStatsOp) Close

func (op *CountStatsOp) Close() error

func (*CountStatsOp) Next

func (op *CountStatsOp) Next() (Row, *planner.Schema, error)

func (*CountStatsOp) Open

func (op *CountStatsOp) Open() error

type CreateIndexOp

type CreateIndexOp struct {
	// contains filtered or unexported fields
}

CreateIndexOp CREATE INDEX 算子:更新元数据 + 全表扫描回填索引条目

func (*CreateIndexOp) Close

func (op *CreateIndexOp) Close() error

func (*CreateIndexOp) Next

func (op *CreateIndexOp) Next() (Row, *planner.Schema, error)

func (*CreateIndexOp) Open

func (op *CreateIndexOp) Open() error

type CreateTableOp

type CreateTableOp struct {
	// contains filtered or unexported fields
}

CreateTableOp CREATE TABLE 算子

func NewCreateTableOp

func NewCreateTableOp(txn engine.Transaction, cat *catalog.Catalog, plan *planner.PhysicalCreateTable) *CreateTableOp

NewCreateTableOp 创建 CreateTable 算子

func (*CreateTableOp) Close

func (op *CreateTableOp) Close() error

Close 无资源需要释放

func (*CreateTableOp) Next

func (op *CreateTableOp) Next() (Row, *planner.Schema, error)

Next 执行一次建表操作后返回 nil

func (*CreateTableOp) Open

func (op *CreateTableOp) Open() error

Open 无预处理

type CreateViewOp added in v1.1.6

type CreateViewOp struct {
	// contains filtered or unexported fields
}

CreateViewOp CREATE VIEW 算子

func NewCreateViewOp added in v1.1.6

func NewCreateViewOp(txn engine.Transaction, cat *catalog.Catalog, plan *planner.PhysicalCreateView) *CreateViewOp

NewCreateViewOp 创建 CreateViewOp 算子

func (*CreateViewOp) Close added in v1.1.6

func (op *CreateViewOp) Close() error

func (*CreateViewOp) Next added in v1.1.6

func (op *CreateViewOp) Next() (Row, *planner.Schema, error)

Next 执行一次建视图操作

func (*CreateViewOp) Open added in v1.1.6

func (op *CreateViewOp) Open() error

type DeleteOp

type DeleteOp struct {
	// contains filtered or unexported fields
}

DeleteOp DELETE 算子

func NewDeleteOp

func NewDeleteOp(txn engine.Transaction, cat *catalog.Catalog, child Operator, plan *planner.PhysicalDelete) *DeleteOp

NewDeleteOp 创建 Delete 算子 cat 用于删除完成后维护 RowCount 统计信息

func (*DeleteOp) Close

func (op *DeleteOp) Close() error

Close 关闭子算子

func (*DeleteOp) Next

func (op *DeleteOp) Next() (Row, *planner.Schema, error)

Next 消费子算子所有行并执行删除,每删一行返回一个哨兵行供 RowsAffected 计数。 所有行处理完毕后返回 nil。

func (*DeleteOp) Open

func (op *DeleteOp) Open() error

Open 初始化子算子

type DistinctOp added in v1.2.0

type DistinctOp struct {
	// contains filtered or unexported fields
}

DistinctOp SELECT DISTINCT 去重算子。 SkipDedup 为 true 时(优化器已判定底层唯一索引保证唯一性),直接透传子算子输出, 跳过内存 hash-set 去重。

func NewDistinctOp added in v1.2.0

func NewDistinctOp(child Operator, plan *planner.PhysicalDistinct) *DistinctOp

NewDistinctOp 创建 DistinctOp 算子。

func (*DistinctOp) Close added in v1.2.0

func (op *DistinctOp) Close() error

func (*DistinctOp) Next added in v1.2.0

func (op *DistinctOp) Next() (Row, *planner.Schema, error)

func (*DistinctOp) Open added in v1.2.0

func (op *DistinctOp) Open() error

type DropIndexOp

type DropIndexOp struct {
	// contains filtered or unexported fields
}

DropIndexOp DROP INDEX 算子:清理索引条目 + 更新元数据

func (*DropIndexOp) Close

func (op *DropIndexOp) Close() error

func (*DropIndexOp) Next

func (op *DropIndexOp) Next() (Row, *planner.Schema, error)

func (*DropIndexOp) Open

func (op *DropIndexOp) Open() error

type DropTableOp

type DropTableOp struct {
	// contains filtered or unexported fields
}

DropTableOp DROP TABLE 算子

func NewDropTableOp

func NewDropTableOp(txn engine.Transaction, cat *catalog.Catalog, plan *planner.PhysicalDropTable) *DropTableOp

NewDropTableOp 创建 DropTable 算子

func (*DropTableOp) Close

func (op *DropTableOp) Close() error

Close 无资源需要释放

func (*DropTableOp) Next

func (op *DropTableOp) Next() (Row, *planner.Schema, error)

Next 执行一次删表操作后返回 nil

func (*DropTableOp) Open

func (op *DropTableOp) Open() error

Open 无预处理

type DropViewOp added in v1.1.6

type DropViewOp struct {
	// contains filtered or unexported fields
}

DropViewOp DROP VIEW 算子

func NewDropViewOp added in v1.1.6

func NewDropViewOp(txn engine.Transaction, cat *catalog.Catalog, plan *planner.PhysicalDropView) *DropViewOp

NewDropViewOp 创建 DropViewOp 算子

func (*DropViewOp) Close added in v1.1.6

func (op *DropViewOp) Close() error

func (*DropViewOp) Next added in v1.1.6

func (op *DropViewOp) Next() (Row, *planner.Schema, error)

Next 执行一次删视图操作

func (*DropViewOp) Open added in v1.1.6

func (op *DropViewOp) Open() error

type DualScanOp added in v1.1.6

type DualScanOp struct {
	// contains filtered or unexported fields
}

DualScanOp 虚拟单行扫描算子,产生一行空的 Row 后返回 EOF

func NewDualScanOp added in v1.1.6

func NewDualScanOp() *DualScanOp

NewDualScanOp 创建 DualScan 算子

func (*DualScanOp) Close added in v1.1.6

func (op *DualScanOp) Close() error

func (*DualScanOp) Next added in v1.1.6

func (op *DualScanOp) Next() (Row, *planner.Schema, error)

func (*DualScanOp) Open added in v1.1.6

func (op *DualScanOp) Open() error

type ExecContext

type ExecContext struct {
	// Txn 当前事务(必填)
	Txn engine.Transaction
	// Cat Catalog 实例(必填,用于 DDL 操作和统计信息更新)
	Cat *catalog.Catalog
	// Ctx 请求上下文,用于取消传播。nil 时等同于 context.Background()。
	// 长时间运行的算子(如全表扫描、排序)应周期性检查 Ctx.Done() 并返回 context.Canceled。
	Ctx context.Context
	// Params SQL 占位符 ? 的绑定值,按出现顺序索引(M2 新增,可为 nil)
	Params []interface{}
	// NamedParams 命名参数的绑定值(P2-SQ-07 新增,可为 nil)。
	// key 为参数名(如 "name" 对应 @name),value 为绑定值。
	// 命名参数与位置参数可混合使用:位置参数走 Params,命名参数走 NamedParams。
	NamedParams map[string]interface{}
	// Debugf 诊断回调(可选)。设置后,执行器在关键路径输出调试信息。nil 时无开销。
	Debugf func(format string, args ...interface{})
}

ExecContext 执行器上下文,贯穿整棵执行树。 M2 新增:携带参数绑定值(Params),支持 Prepared Statement 风格占位符替换。 P2-SQ-07:新增 NamedParams 支持命名参数(如 @name)绑定。

type ExplainOp added in v1.1.6

type ExplainOp struct {
	// contains filtered or unexported fields
}

ExplainOp EXPLAIN 算子,执行一次后返回计划文本行,之后返回 nil(结束)

func NewExplainOp added in v1.1.6

func NewExplainOp(plan *planner.PhysicalExplain) *ExplainOp

NewExplainOp 创建 Explain 算子

func (*ExplainOp) Close added in v1.1.6

func (op *ExplainOp) Close() error

func (*ExplainOp) Next added in v1.1.6

func (op *ExplainOp) Next() (Row, *planner.Schema, error)

func (*ExplainOp) Open added in v1.1.6

func (op *ExplainOp) Open() error

type FilterOp

type FilterOp struct {
	// contains filtered or unexported fields
}

FilterOp WHERE 过滤算子

func NewFilterOp

func NewFilterOp(child Operator, plan *planner.PhysicalFilter, params []interface{}) *FilterOp

NewFilterOp 创建 Filter 算子

func NewFilterOpCtx added in v1.1.6

func NewFilterOpCtx(child Operator, plan *planner.PhysicalFilter, params []interface{}, ctx *ExecContext) *FilterOp

NewFilterOpCtx 创建带执行上下文的 Filter 算子(子查询场景使用)

func (*FilterOp) Close

func (op *FilterOp) Close() error

Close 关闭子算子

func (*FilterOp) Next

func (op *FilterOp) Next() (Row, *planner.Schema, error)

Next 从子算子拉取,跳过不满足谓词的行

func (*FilterOp) Open

func (op *FilterOp) Open() error

Open 初始化子算子 + 编译谓词为字节码

type IndexScanOp

type IndexScanOp struct {
	// contains filtered or unexported fields
}

IndexScanOp 二级索引扫描算子。

普通模式:扫索引区间 → 取主键编码 → MakeRowKey 回表点查 → 解码完整行 → 列投影 覆盖模式(Covering=true):直接从索引 key 解码各列值,跳过回表(零 I/O 放大)

索引 key 格式:

  • 唯一索引:prefix(6B) + colsEncoded,value = pkBytes
  • 非唯一索引:prefix(6B) + colsEncoded + pkEncoded,value = 占位字节

func NewIndexScanOp

func NewIndexScanOp(txn engine.Transaction, plan *planner.PhysicalIndexScan) *IndexScanOp

func (*IndexScanOp) Close

func (op *IndexScanOp) Close() error

func (*IndexScanOp) Next

func (op *IndexScanOp) Next() (Row, *planner.Schema, error)

func (*IndexScanOp) Open

func (op *IndexScanOp) Open() error

type InfoSchemaColumnsOp added in v1.1.6

type InfoSchemaColumnsOp struct {
	// contains filtered or unexported fields
}

InfoSchemaColumnsOp INFORMATION_SCHEMA.COLUMNS 虚拟扫描算子

func NewInfoSchemaColumnsOp added in v1.1.6

func NewInfoSchemaColumnsOp(cat *catalog.Catalog, txn engine.Transaction, filterTable string) *InfoSchemaColumnsOp

NewInfoSchemaColumnsOp 创建 InfoSchemaColumnsOp

func (*InfoSchemaColumnsOp) Close added in v1.1.6

func (op *InfoSchemaColumnsOp) Close() error

func (*InfoSchemaColumnsOp) Next added in v1.1.6

func (op *InfoSchemaColumnsOp) Next() (Row, *planner.Schema, error)

func (*InfoSchemaColumnsOp) Open added in v1.1.6

func (op *InfoSchemaColumnsOp) Open() error

type InfoSchemaTablesOp added in v1.1.6

type InfoSchemaTablesOp struct {
	// contains filtered or unexported fields
}

InfoSchemaTablesOp INFORMATION_SCHEMA.TABLES 虚拟扫描算子

func NewInfoSchemaTablesOp added in v1.1.6

func NewInfoSchemaTablesOp(cat *catalog.Catalog, txn engine.Transaction) *InfoSchemaTablesOp

NewInfoSchemaTablesOp 创建 InfoSchemaTablesOp

func (*InfoSchemaTablesOp) Close added in v1.1.6

func (op *InfoSchemaTablesOp) Close() error

func (*InfoSchemaTablesOp) Next added in v1.1.6

func (op *InfoSchemaTablesOp) Next() (Row, *planner.Schema, error)

func (*InfoSchemaTablesOp) Open added in v1.1.6

func (op *InfoSchemaTablesOp) Open() error

type InfoSchemaViewsOp added in v1.1.9

type InfoSchemaViewsOp struct {
	// contains filtered or unexported fields
}

InfoSchemaViewsOp INFORMATION_SCHEMA.VIEWS 虚拟扫描算子

func NewInfoSchemaViewsOp added in v1.1.9

func NewInfoSchemaViewsOp(cat *catalog.Catalog, txn engine.Transaction) *InfoSchemaViewsOp

NewInfoSchemaViewsOp 创建 InfoSchemaViewsOp

func (*InfoSchemaViewsOp) Close added in v1.1.9

func (op *InfoSchemaViewsOp) Close() error

func (*InfoSchemaViewsOp) Next added in v1.1.9

func (op *InfoSchemaViewsOp) Next() (Row, *planner.Schema, error)

func (*InfoSchemaViewsOp) Open added in v1.1.9

func (op *InfoSchemaViewsOp) Open() error

type InsertOp

type InsertOp struct {
	LastInsertId int64 // 最后插入的 AUTO_INCREMENT 值(无自增列时为 0)
	// contains filtered or unexported fields
}

InsertOp INSERT 写入算子(支持单行和多行)

func NewInsertOp

func NewInsertOp(txn engine.Transaction, cat *catalog.Catalog, plan *planner.PhysicalInsert, params []interface{}, namedParams ...map[string]interface{}) *InsertOp

func (*InsertOp) Close

func (op *InsertOp) Close() error

Close 无资源需要释放

func (*InsertOp) Next

func (op *InsertOp) Next() (Row, *planner.Schema, error)

Next 逐行写入,所有行写入完毕后逐行发出结果。 - 有 RETURNING 子句:每行返回求值后的 RETURNING 表达式结果 - 无 RETURNING 子句:每行返回空 Row 作为计数哨兵(供调用方统计 RowsAffected) 所有行返回完毕后返回 nil。

func (*InsertOp) Open

func (op *InsertOp) Open() error

type LimitOp

type LimitOp struct {
	// contains filtered or unexported fields
}

LimitOp LIMIT/OFFSET 算子:跳过 Offset 行后返回至多 Count 行

func NewLimitOp

func NewLimitOp(child Operator, plan *planner.PhysicalLimit) *LimitOp

NewLimitOp 创建 LimitOp

func (*LimitOp) Close

func (op *LimitOp) Close() error

func (*LimitOp) Next

func (op *LimitOp) Next() (Row, *planner.Schema, error)

func (*LimitOp) Open

func (op *LimitOp) Open() error

type MultiGetOp

type MultiGetOp struct {
	// contains filtered or unexported fields
}

MultiGetOp 多点查算子:对 WHERE pk IN (v1, v2, ...) 的每个值执行一次 txn.Get()。

func NewMultiGetOp

func NewMultiGetOp(txn engine.Transaction, plan *planner.PhysicalMultiGet) *MultiGetOp

NewMultiGetOp 创建 MultiGetOp

func (*MultiGetOp) Close

func (op *MultiGetOp) Close() error

Close 释放资源

func (*MultiGetOp) Next

func (op *MultiGetOp) Next() (Row, *planner.Schema, error)

Next 返回下一行

func (*MultiGetOp) Open

func (op *MultiGetOp) Open() error

Open 预取所有行(对每个 key 执行一次 Get)

type NLJOp

type NLJOp struct {
	// contains filtered or unexported fields
}

NLJOp Nested Loop Join:对每条左行重新扫描全部右行,找到匹配的行拼接输出 RIGHT JOIN 通过交换左右算子并在输出时交换列位置来实现

func NewNLJOp

func NewNLJOp(left, right Operator, plan *planner.PhysicalNLJ, params []interface{}, namedParams ...map[string]interface{}) *NLJOp

NewNLJOp 创建 NLJOp

func (*NLJOp) Close

func (op *NLJOp) Close() error

func (*NLJOp) Next

func (op *NLJOp) Next() (Row, *planner.Schema, error)

func (*NLJOp) Open

func (op *NLJOp) Open() error

type Operator

type Operator interface {
	// Open 初始化算子,建立资源(如打开游标)。
	// 在第一次调用 Next 之前必须调用 Open。
	Open() error

	// Next 返回下一行数据和输出 Schema。
	// 当没有更多数据时返回 (nil, nil, nil)(EOF 信号)。
	Next() (Row, *planner.Schema, error)

	// Close 释放算子持有的资源。
	Close() error
}

Operator Volcano 模型算子接口

func Build

func Build(ctx *ExecContext, plan planner.PhysicalPlan) (Operator, error)

Build 将物理执行计划递归转换为 Operator 执行树(M2:使用 ExecContext)

type ProjectOp

type ProjectOp struct {
	// contains filtered or unexported fields
}

ProjectOp SELECT 投影算子

func NewProjectOp

func NewProjectOp(child Operator, plan *planner.PhysicalProject, params []interface{}) *ProjectOp

NewProjectOp 创建 Project 算子

func NewProjectOpCtx added in v1.1.6

func NewProjectOpCtx(child Operator, plan *planner.PhysicalProject, params []interface{}, ctx *ExecContext) *ProjectOp

NewProjectOpCtx 创建带执行上下文的 Project 算子

func (*ProjectOp) Close

func (op *ProjectOp) Close() error

Close 关闭子算子

func (*ProjectOp) Next

func (op *ProjectOp) Next() (Row, *planner.Schema, error)

Next 从子算子拉取一行,按投影表达式重写后返回

func (*ProjectOp) Open

func (op *ProjectOp) Open() error

Open 初始化子算子

type ReleaseSavepointOp added in v1.1.6

type ReleaseSavepointOp struct {
	// contains filtered or unexported fields
}

ReleaseSavepointOp 释放保存点算子

func NewReleaseSavepointOp added in v1.1.6

func NewReleaseSavepointOp(txn engine.Transaction, name string) *ReleaseSavepointOp

NewReleaseSavepointOp 创建 ReleaseSavepointOp

func (*ReleaseSavepointOp) Close added in v1.1.6

func (op *ReleaseSavepointOp) Close() error

func (*ReleaseSavepointOp) Next added in v1.1.6

func (op *ReleaseSavepointOp) Next() (Row, *planner.Schema, error)

func (*ReleaseSavepointOp) Open added in v1.1.6

func (op *ReleaseSavepointOp) Open() error

type RollbackToSavepointOp added in v1.1.6

type RollbackToSavepointOp struct {
	// contains filtered or unexported fields
}

RollbackToSavepointOp 回滚到保存点算子

func NewRollbackToSavepointOp added in v1.1.6

func NewRollbackToSavepointOp(txn engine.Transaction, name string) *RollbackToSavepointOp

NewRollbackToSavepointOp 创建 RollbackToSavepointOp

func (*RollbackToSavepointOp) Close added in v1.1.6

func (op *RollbackToSavepointOp) Close() error

func (*RollbackToSavepointOp) Next added in v1.1.6

func (op *RollbackToSavepointOp) Next() (Row, *planner.Schema, error)

func (*RollbackToSavepointOp) Open added in v1.1.6

func (op *RollbackToSavepointOp) Open() error

type Row

type Row []interface{}

Row 一行数据,每个元素对应 Schema 中同位置的列值。 nil 表示 NULL。

提供三层访问接口:

便捷层: row.Int(0), row.Str(1)     — 90% 场景
安全层: row.Scan(&id, &name)       — 多列解码
性能层: row[0].(int64)             — 热路径

func (Row) Bool

func (r Row) Bool(idx int) bool

Bool 读取第 idx 列为 bool。NULL 返回 false。

func (Row) Bytes

func (r Row) Bytes(idx int) []byte

Bytes 读取第 idx 列为 []byte。NULL 返回 nil。

func (Row) Float

func (r Row) Float(idx int) float64

Float 读取第 idx 列为 float64。NULL 返回 0。

func (Row) Int

func (r Row) Int(idx int) int64

Int 读取第 idx 列为 int64。NULL 返回 0。

func (Row) IsNull

func (r Row) IsNull(idx int) bool

IsNull 判断第 idx 列是否为 NULL。

func (Row) Scan

func (r Row) Scan(dest ...interface{}) error

Scan 将行数据解码到 dest 指针中,按列顺序一一对应。 参数个数必须与列数一致,NULL 列写入对应类型的零值。 如果 dest 实现了 Scanner 接口,优先调用其 Scan 方法。 不支持的类型返回错误。

func (Row) Str

func (r Row) Str(idx int) string

Str 读取第 idx 列为 string。NULL 返回 ""。

type SavepointOp added in v1.1.6

type SavepointOp struct {
	// contains filtered or unexported fields
}

SavepointOp 创建保存点算子

func NewSavepointOp added in v1.1.6

func NewSavepointOp(txn engine.Transaction, name string) *SavepointOp

NewSavepointOp 创建 SavepointOp

func (*SavepointOp) Close added in v1.1.6

func (op *SavepointOp) Close() error

func (*SavepointOp) Next added in v1.1.6

func (op *SavepointOp) Next() (Row, *planner.Schema, error)

func (*SavepointOp) Open added in v1.1.6

func (op *SavepointOp) Open() error

type Scanner added in v1.1.6

type Scanner interface {
	// Scan 将当前列值赋值给接收者。src 为 nil 时表示 NULL。
	Scan(src interface{}) error
}

Scanner SQL 行扫描接口,与 database/sql.Scanner 语义一致。 实现了 Scanner 的类型可用于 Row.Scan() 和 RowResult.Scan(), 实现自定义 NULL 处理逻辑。

type SetOpOp added in v1.1.6

type SetOpOp struct {
	// contains filtered or unexported fields
}

SetOpOp 集合运算算子(UNION / INTERSECT / EXCEPT)。 左右两侧子算子先全量物化,再按语义合并。

func NewSetOpOp added in v1.1.6

func NewSetOpOp(plan *planner.PhysicalSetOp, left, right Operator) *SetOpOp

NewSetOpOp 创建集合运算算子(仅支持二元,左右两个输入)。

func (*SetOpOp) Close added in v1.1.6

func (op *SetOpOp) Close() error

func (*SetOpOp) Next added in v1.1.6

func (op *SetOpOp) Next() (Row, *planner.Schema, error)

func (*SetOpOp) Open added in v1.1.6

func (op *SetOpOp) Open() error

type ShowColumnsOp added in v1.1.6

type ShowColumnsOp struct {
	// contains filtered or unexported fields
}

ShowColumnsOp SHOW COLUMNS FROM t 算子

func NewShowColumnsOp added in v1.1.6

func NewShowColumnsOp(cat *catalog.Catalog, txn engine.Transaction, tableName string) *ShowColumnsOp

NewShowColumnsOp 创建 ShowColumnsOp

func (*ShowColumnsOp) Close added in v1.1.6

func (op *ShowColumnsOp) Close() error

func (*ShowColumnsOp) Next added in v1.1.6

func (op *ShowColumnsOp) Next() (Row, *planner.Schema, error)

func (*ShowColumnsOp) Open added in v1.1.6

func (op *ShowColumnsOp) Open() error

type ShowTablesOp added in v1.1.6

type ShowTablesOp struct {
	// contains filtered or unexported fields
}

ShowTablesOp SHOW TABLES 算子:从 catalog 读取所有表名

func NewShowTablesOp added in v1.1.6

func NewShowTablesOp(cat *catalog.Catalog, txn engine.Transaction) *ShowTablesOp

NewShowTablesOp 创建 ShowTablesOp

func (*ShowTablesOp) Close added in v1.1.6

func (op *ShowTablesOp) Close() error

func (*ShowTablesOp) Next added in v1.1.6

func (op *ShowTablesOp) Next() (Row, *planner.Schema, error)

func (*ShowTablesOp) Open added in v1.1.6

func (op *ShowTablesOp) Open() error

type SortOp

type SortOp struct {
	// contains filtered or unexported fields
}

SortOp ORDER BY 算子:一次性拉取所有输入行,按 OrderItems 排序后逐行返回

func NewSortOp

func NewSortOp(child Operator, plan *planner.PhysicalSort, params []interface{}, namedParams ...map[string]interface{}) *SortOp

NewSortOp 创建 SortOp。namedParams 为可选命名参数(P2-SQ-07)。

func (*SortOp) Close

func (op *SortOp) Close() error

func (*SortOp) Next

func (op *SortOp) Next() (Row, *planner.Schema, error)

func (*SortOp) Open

func (op *SortOp) Open() error

type TableScanOp

type TableScanOp struct {
	// contains filtered or unexported fields
}

TableScanOp 表扫描算子,根据 PhysicalTableScan.Mode 选择扫描方式:

  • ScanModeFull:全表扫,遍历 [tablePrefix, tablePrefixEnd)
  • ScanModePoint:点查,扫描 [KeyRange.Start, KeyRange.End](Start==End)
  • ScanModeRange:范围扫,扫描 [KeyRange.Start, KeyRange.End]

func NewTableScanOp

func NewTableScanOp(txn engine.Transaction, plan *planner.PhysicalTableScan, ctx context.Context, debugf func(string, ...interface{})) *TableScanOp

NewTableScanOp 创建 TableScan 算子

func (*TableScanOp) Close

func (op *TableScanOp) Close() error

Close 关闭迭代器

func (*TableScanOp) Next

func (op *TableScanOp) Next() (Row, *planner.Schema, error)

Next 返回下一行,无数据时返回 nil。 Point/Range 模式:当当前 key > endKey 时提前终止。 每 100 行检查一次 ctx.Done(),支持查询取消。

func (*TableScanOp) Open

func (op *TableScanOp) Open() error

Open 根据扫描模式创建迭代器,定位到起始位置。

  • Full:扫描整个表命名空间
  • Point/Range:扫描 KeyRange 指定的闭区间(存储层 Scan 使用半开区间,endKey+1 近似)

type TruncateTableOp added in v1.1.6

type TruncateTableOp struct {
	// contains filtered or unexported fields
}

TruncateTableOp TRUNCATE TABLE 算子:删除表中所有行(含索引条目),重置行数统计。

func NewTruncateTableOp added in v1.1.6

func NewTruncateTableOp(txn engine.Transaction, cat *catalog.Catalog, plan *planner.PhysicalTruncateTable) *TruncateTableOp

NewTruncateTableOp 创建 TruncateTable 算子

func (*TruncateTableOp) Close added in v1.1.6

func (op *TruncateTableOp) Close() error

func (*TruncateTableOp) Next added in v1.1.6

func (op *TruncateTableOp) Next() (Row, *planner.Schema, error)

func (*TruncateTableOp) Open added in v1.1.6

func (op *TruncateTableOp) Open() error

type UpdateOp

type UpdateOp struct {
	// contains filtered or unexported fields
}

UpdateOp UPDATE 算子(全量更新匹配行)

func NewUpdateOp

func NewUpdateOp(txn engine.Transaction, cat *catalog.Catalog, child Operator, plan *planner.PhysicalUpdate, params []interface{}, namedParams ...map[string]interface{}) *UpdateOp

func (*UpdateOp) Close

func (op *UpdateOp) Close() error

Close 关闭子算子

func (*UpdateOp) Next

func (op *UpdateOp) Next() (Row, *planner.Schema, error)

func (*UpdateOp) Open

func (op *UpdateOp) Open() error

type VMInstruction

type VMInstruction struct {
	Op  vmOp
	Arg int
}

type VMProgram

type VMProgram struct {
	// contains filtered or unexported fields
}

func Compile

func Compile(e expr.Expression) (*VMProgram, error)

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL