1 接收查询请求
UserServerRequestHandler
handle方法
2 提交任务
UserWorker
submitWork提交作业
初始化Foreman
线程池执行Foreman
3 执行任务
Foreman是一个线程。
- 修改线程名
- 调用runSQL方法
3.1获取物理计划
DrillSqlWorker.getPlan(QueryContext context, String sql, Pointer textPlan)
3.1.1 根据查询上下文获取sql转换器
SqlConverter:负责管理sql语句的解析、验证和toRel转换。
实例化SqlConverter:
- 保存查询上下文
- 获取内置函数
- 解析SQL的config
- JavaTypeFactoryImpl
- 默认的SchemaPlus
- root SchemaPlus
- UserSession
- DrillConfig
- DrillCalciteCatalogReader
- SqlOperatorTable
- RelOptCostFactory
- DrillValidator
3.1.2获取SQL解析树
SqlNode是一个SQL解析树。
3.1.3 根据SqlNode的类型构造AbstractSqlHandler
new DefaultSqlHandler(config, textPlan);
3.1.3.1 DefaultSqlHandler.getPlan(SqlNode sqlNode)
3.1.3.1.1 DefaultSqlHandler.validateAndConvert(SqlNode sqlNode)
3.1.3.1.1.1 重写语法树
3.1.3.1.1.2 DefaultSqlHandler.validateNode(SqlNode sqlNode)
返回Pair<SqlNode, RelDataType>
- SqlConverter.validate(final SqlNode parsedNode)
1.1 SqlValidatorImpl.validate(SqlNode topNode)
EmptyScope是什么
1.1.1 SqlValidatorImpl.validateScopedExpression( SqlNode topNode, SqlValidatorScope scope)
1.1.1.1 SqlSelect.validate(SqlValidator validator, SqlValidatorScope scope)
1.1.1.1.1 SqlValidatorImpl.validateQuery(SqlNode node, SqlValidatorScope scope,RelDataType targetRowType)
SqlValidatorNamespace是什么?
SelectNamespace.validateImpl(RelDataType targetRowType):返回RelDataType
SqlValidatorImpl.validateSelect(SqlSelect select, RelDataType targetRowType):返回void
SqlConverter.DrillValidator.validateFrom(SqlNode node,RelDataType targetRowType,SqlValidatorScope scope)
SqlConverter.DrillCalciteCatalogReader.getTable(List names):返回Prepare.PreparingTable
CalciteCatalogReader.getTable(final List names):返回Prepare.PreparingTable
SqlValidatorUtil.getTableEntry(SqlValidatorCatalogReader catalogReader, List names)
SqlValidatorUtil.getSchema(CalciteSchema rootSchema,Iterable schemaPath, SqlNameMatcher nameMatcher)
CalciteSchema.getSubSchema (String schemaName,boolean caseSensitive)
DynamicRootSchema.getImplicitSubSchema(String schemaName, boolean caseSensitive)第二次运行的时候获取subSchemaMap时是否为空
DynamicRootSchema.loadSchemaFactory(String schemaName, boolean caseSensitive)
StoragePluginRegistryImpl.getPlugin(String name)
HBaseStoragePlugin.registerSchemas(SchemaConfig schemaConfig, SchemaPlus parent)
SqlValidatorUtil.getTableEntryFrom(CalciteSchema schema, String name, boolean caseSensitive)
SimpleCalciteSchema.getImplicitTable(String tableName, boolean caseSensitive)
HBaseSchemaFactory.HBaseSchema.getTable(String name)
AbstractHBaseDrillTable. setTableDesc(Connection connection, String tableName)
3.1.3.1.1.3 DefaultSqlHandler.convertToRel(SqlNode node)
3.1.3.1.2 DefaultSqlHandler.convertToDrel(RelNode relNode)
返回DrillRel
3.1.3.1.3 DefaultSqlHandler.convertToPrel(RelNode drel, RelDataType validatedRowType)
应用物理规则和某些转换将drill关系节点转换为物理节点。
返回Prel
3.1.3.1.4 DefaultSqlHandler.convertToPop(Prel prel)
返回PhysicalOperator
3.1.3.1.5 DefaultSqlHandler.convertToPlan(PhysicalOperator op)
返回PhysicalPlan
3.2 执行物理计划
Foreman.runPhysicalPlanf(inal PhysicalPlan plan, Pointer textPlan)
查询hbase
RecordReader.setup(OperatorContext context, OutputMutator output)
HBaseRecordReader.getOrCreateFamilyVector(String familyName, boolean allocateOnCreate)
HBaseRecordReader.next()
DrillCursor.getNext()
核心代码
DeultSqlHandler.validateAndConvert(SqlNode sqlNode)
SqlValidatorImpl.alidateScopedExpression()