Velox DataSource 源码核对清单
基线:origin/main c52ff97b4b5b0f2d0f931f989e5f9c98020927ba,2026-10-21。
本文按真实 TableScan 调用者核对 Hive / Iceberg 的 CPU 文件扫描。没有改动 Velox,也未运行完整引擎测试。13 个场景为源码推演;小型数据选择与桶号算例单独校验。
主调用链
TableScanNode → TableScan::getSplit / getOutput → registry-selected Connector → FileDataSource constructor → subclass createSplitReader → FileSplitReader/override prepareSplit → DWIO Reader / RowReader → subclass next → residual ExprSet → output projection → splitFinished / next split / takeover。
重点行为边界
- 普通 split 复用 ScanSpec;extraction/bucket/preload 是不同创建或替换路径。
- moveAdaptationFrom 只处理直接 child,跳 constant,不递归、不清缓存、不复制 metadata/extraction。
- MetadataFilter leaf 与创建时 ScanSpec 绑定;重建不自动重绑。
- DataSource 的 R、G、P 类型与实际 RowVector/child.type 分开检查,前 N 列保持投影契约。
- zero-projection 带辅助列的非零行路径返回内部 RowVector;空 batch 使用计划类型。
- 动态 Filter 在 Driver 合并,在 ScanSpec 替换;常量与 takeover 时序有独立边界。
- donor context、ExprSet listener 析构与 borrowed reader 状态应分别做寿命审计。
- Iceberg position/DV 在 DWIO Mutation 阶段,equality delete 在读 key 后;changelog 分路。
13 个场景
- 15.1 输出名称与表/文件列名不同
- 15.2 输出 c0,remaining filter 用未投影 c1
- 15.3 某列仅做 reader 下推过滤
- 15.4 ROW / ARRAY / MAP 子字段裁剪
- 15.5 extraction 把 MAP 变成 ARRAY
- 15.6 只输出分区列、row index 或 Hive row ID
- 15.7 文件缺列后又重新出现
- 15.8 相同隐藏桶列的连续 split,同时有嵌套 Filter
- 15.9 Hive row ID 常量在连续 split 与 takeover 后变化
- 15.10 Equality delete 需要未投影 key
- 15.11 Position delete、lineage 与 changelog
- 15.12 动态过滤遇到真实列、缺失列、常量与 preload
- 15.13 零输出列、零 batch、空 split
固定版本源码入口
- TableScanNode —
velox/core/PlanNode.h:1040 - TableScan 构造函数 —
velox/exec/TableScan.cpp:90 - getSplit —
velox/exec/TableScan.cpp:367 - HiveConnector::createDataSource —
velox/connectors/hive/HiveConnector.cpp:64 - IcebergConnector::createDataSource —
velox/connectors/hive/iceberg/IcebergConnector.cpp:123 - FileDataSource::next —
velox/connectors/hive/FileDataSource.cpp:449 - TableScan::getOutput —
velox/exec/TableScan.cpp:147 - ConnectorTableHandle —
velox/connectors/Connector.h:178 - IcebergTableHandle —
velox/connectors/hive/iceberg/IcebergTableHandle.h:35 - FileTableHandle —
velox/connectors/hive/FileTableHandle.h:31 - TableHandle.h —
velox/connectors/hive/TableHandle.h:183 - configureReaderOptions —
velox/connectors/hive/FileConnectorUtil.cpp:99 - configureRowReaderOptions —
velox/connectors/hive/FileConnectorUtil.cpp:195 - FileColumnHandle —
velox/connectors/hive/FileColumnHandle.h:175 - ColumnHandle —
velox/connectors/Connector.h:134 - IcebergColumnHandle —
velox/connectors/hive/iceberg/IcebergColumnHandle.h:31 - checkColumnHandleConsistent —
velox/connectors/hive/HiveConnectorUtil.cpp:351 - TableHandle.cpp —
velox/connectors/hive/TableHandle.cpp:114 - FileConnectorSplit —
velox/connectors/hive/FileConnectorSplit.h:31 - HiveConnectorSplit —
velox/connectors/hive/HiveConnectorSplit.h:43 - HiveIcebergSplit —
velox/connectors/hive/iceberg/IcebergSplit.h:32 - 构造函数 —
velox/connectors/hive/FileDataSource.cpp:128 - setupBucketConversion —
velox/connectors/hive/HiveDataSource.cpp:46 - appendProjectedColumns —
velox/connectors/hive/iceberg/IcebergSplitReader.cpp:695 - configureExtractionColumns —
velox/connectors/hive/FileDataSource.cpp:287 - SelectiveRepeatedColumnReader —
velox/dwio/common/SelectiveRepeatedColumnReader.cpp:373 - TransformColumnLoader —
velox/dwio/common/ColumnLoader.cpp:119 - Filter::merge —
velox/type/Filter.h:282 - extractFiltersFromRemainingFilter —
velox/connectors/hive/HiveConnectorUtil.cpp:761 - TypedExpr parser 的 toSubfield —
velox/expression/ExprToSubfieldFilter.cpp:491 - FileDataSource.cpp:170 —
velox/connectors/hive/FileDataSource.cpp:170 - OperatorCtx::createConnectorQueryCtx —
velox/exec/Operator.cpp:58 - 按需创建自己的 ExecCtx —
velox/expression/Expr.cpp:2480 - shouldEagerlyMaterialize —
velox/connectors/hive/HiveConnectorUtil.cpp:890 - makeScanSpec —
velox/connectors/hive/HiveConnectorUtil.cpp:393 - stableChildren() —
velox/dwio/common/ScanSpec.cpp:143 - addSubfields —
velox/connectors/hive/HiveConnectorUtil.cpp:99 - MetadataFilter 构造 —
velox/dwio/common/MetadataFilter.cpp:231 - FileDataSource::addSplit —
velox/connectors/hive/FileDataSource.cpp:410 - FileSplitReader::prepareSplit —
velox/connectors/hive/FileSplitReader.cpp:137 - ScanSpec::newRead —
velox/dwio/common/ScanSpec.cpp:102 - compareTimeToDropValue —
velox/dwio/common/ScanSpec.cpp:65 - SelectiveStructColumnReaderBase::read —
velox/dwio/common/SelectiveStructColumnReader.cpp:433 - getValues —
velox/dwio/common/SelectiveStructColumnReader.cpp:608 - Expr::eval 的加载分支 —
velox/expression/Expr.cpp:904 - EvalCtx::ensureFieldLoaded —
velox/expression/EvalCtx.cpp:347 - exec::wrap 的这个重载 —
velox/exec/OperatorUtils.cpp:392 - prepareResult / tryReuseResult —
velox/dwio/common/SelectiveStructColumnReader.cpp:46 - SelectiveNimbleRowReader::computeLazyIoColumns —
velox/dwio/nimble/velox/selective/SelectiveNimbleReader.cpp:884 - LazyInput::load —
velox/dwio/nimble/velox/selective/ReaderBase.cpp:240 - fetchStripe —
velox/dwio/dwrf/reader/StripeReaderBase.cpp:29 - scheduleRowGroups —
velox/dwio/parquet/reader/ParquetReader.cpp:1526 - HivePartitionFunction —
velox/connectors/hive/HivePartitionFunction.cpp:360 - setRowNumberField —
velox/dwio/common/SelectiveStructColumnReader.cpp:113 - rowNumberInRemainingFilter —
velox/exec/tests/TableScanTest.cpp:6299 - TableScanTest.rowId —
velox/exec/tests/TableScanTest.cpp:6484 - setupRowIdColumn —
velox/connectors/hive/HiveDataSource.cpp:98 - IcebergSplitReader::buildFieldIds —
velox/connectors/hive/iceberg/IcebergSplitReader.cpp:243 - configureEqualityDeleteColumns —
velox/connectors/hive/iceberg/IcebergSplitReader.cpp:855 - EqualityDeleteFileReader —
velox/connectors/hive/iceberg/EqualityDeleteFileReader.cpp:139 - IcebergSplitReader::next —
velox/connectors/hive/iceberg/IcebergSplitReader.cpp:1076 - 源码明确记录 —
velox/connectors/hive/iceberg/IcebergChangelogSplitReader.cpp:96 - validateSynthesizedColumnFilters —
velox/connectors/hive/HiveSplitReader.cpp:74 - Driver::pushdownFilters —
velox/exec/Driver.cpp:1215 - TableScan::addDynamicFilterLocked —
velox/exec/TableScan.cpp:526 - FileDataSource —
velox/connectors/hive/FileDataSource.cpp:540 - testFilterOnConstant —
velox/dwio/common/SelectiveStructColumnReader.cpp:748 - 实现 —
velox/dwio/common/ScanSpec.cpp:206 - FileDataSource::setFromDataSource —
velox/connectors/hive/FileDataSource.cpp:613 - AsyncSource::prepare —
velox/common/base/AsyncSource.h:72 - ExprSet 析构 —
velox/expression/Expr.cpp:2239 - HiveConnectorTest.makeScanSpecRequiredSubfields* —
velox/connectors/hive/tests/HiveConnectorTest.cpp:92 - TableScanTest.subfieldPruningRowType —
velox/exec/tests/TableScanTest.cpp:701 - remainingFilterLazyWithMultiReferences —
velox/exec/tests/TableScanTest.cpp:4136 - shouldEagerlyMaterialize —
velox/connectors/hive/tests/HiveConnectorUtilTest.cpp:1011 - readMissingFieldsFilesVary —
velox/exec/tests/TableScanTest.cpp:5027 - bucketConversion —
velox/exec/tests/TableScanTest.cpp:3609 - bucketConversionWithSubfieldPruning —
velox/exec/tests/TableScanTest.cpp:3714 - rowIndexWithDynamicFilterOnPartitionKey —
velox/exec/tests/TableScanTest.cpp:6402 - extractionMapKeys —
velox/exec/tests/TableScanTest.cpp:7585 - extractionMultipleFormatsMultipleSplits —
velox/exec/tests/TableScanTest.cpp:8288 - equalityFilterOnlyColumnNotInProjection —
velox/connectors/hive/iceberg/tests/EqualityDeleteFileReaderTest.cpp:437 - nonSequentialEqualityFieldId —
velox/connectors/hive/iceberg/tests/EqualityDeleteFileReaderTest.cpp:611 - rowLineageFilterOnUnprojectedColumnWithExtraction —
velox/connectors/hive/iceberg/tests/IcebergReadTest.cpp:2412 - rowLineageDynamicFilterMidSplit —
velox/connectors/hive/iceberg/tests/IcebergReadTest.cpp:2738 - identityPartitionConstantDoesNotLeakToNextSplit —
velox/connectors/hive/iceberg/tests/IcebergReadTest.cpp:1217 - partitionEnforcedFilterKeptForDynamicFilterOnAdoption —
velox/connectors/hive/iceberg/tests/IcebergReadTest.cpp:1000 - IcebergChangelogE2ETest —
velox/connectors/hive/iceberg/tests/IcebergChangelogE2ETest.cpp:30
配图生成
SVG 按 MacHexo 项目 lark-doc-diagram-style 与 nano-vLLM 图例绘制。下载同目录 draw.py 后使用 Python 3:
1 | python3 draw.py ./diagrams |
生成后仍须用 whiteboard-cli 和中文字体浏览器检查,不能以 XML 合法代替语义与布局检查。