首页 > 编程语言 >【源码阅读】查询

【源码阅读】查询

时间:2023-06-25 19:14:18浏览次数:38  
标签:TableRef analyzer 查询 item 源码 阅读 analyze getExpr tblRef

 

总体流程

StmtExecutor.execute的过程总体分为三步:

● 分析hint

● analyze - 可能会遇到需要forward到master执行的情况;ShowStmt也可能转成SelectStmt

○ Query - analyzeAndGenerateQueryPlan

○ 其他Stmt直接调用对应的Stmt的analyze

● 执行 - handleQueryStmt或其他语句的执行

 

analyze阶段

SelectStmt.analyze

FromClause.analyze

核心在于使用Analyzer.resolveTableRef转化最初的TableRef,并对转化后的TableRef调用analyze

    public void analyze(Analyzer analyzer) throws AnalysisException, UserException {
        TableRef leftTblRef = null;  // the one to the left of tblRef
        for (int i = 0; i < tablerefs.size(); ++i) {
            // Resolve and replace non-InlineViewRef table refs with a BaseTableRef or ViewRef.
            TableRef tblRef = tablerefs.get(i);
            tblRef = analyzer.resolveTableRef(tblRef);
            tablerefs.set(i, Preconditions.checkNotNull(tblRef));
            tblRef.setLeftTblRef(leftTblRef);
            if (tblRef instanceof InlineViewRef) {
                ((InlineViewRef) tblRef).setNeedToSql(needToSql);
            }
            tblRef.analyze(analyzer);
            leftTblRef = tblRef;
        }
    }
 

解析各个SelectListItem

    for (SelectListItem item : selectList.getItems()) {
        if (item.isStar()) {
            TableName tblName = item.getTblName();
            if (tblName == null) {
                expandStar(analyzer);
            } else {
                expandStar(analyzer, tblName);
            }
        } else {
            // Analyze the resultExpr before generating a label to ensure enforcement
            // of expr child and depth limits (toColumn() label may call toSql()).
            item.getExpr().analyze(analyzer);
            if (!(item.getExpr() instanceof CaseExpr)
                    && item.getExpr().contains(Predicates.instanceOf(Subquery.class))) {
                throw new AnalysisException("Subquery is not supported in the select list.");
            }
            Expr expr = rewriteQueryExprByMvColumnExpr(item.getExpr(), analyzer);
            resultExprs.add(expr);
            SlotRef aliasRef = new SlotRef(null, item.toColumnLabel());
            Expr existingAliasExpr = aliasSMap.get(aliasRef);
            if (existingAliasExpr != null && !existingAliasExpr.equals(item.getExpr())) {
                // If we have already seen this alias, it refers to more than one column and
                // therefore is ambiguous.
                ambiguousAliasList.add(aliasRef);
            }
            aliasSMap.put(aliasRef, item.getExpr().clone());
            colLabels.add(item.toColumnLabel());
        }
    }          

 

 

执行阶段

在StmtExecutor.handleQueryStmt中,如果没有开启缓存,直接调用StmtExecutor.sendResult

如果开启缓存

标签:TableRef,analyzer,查询,item,源码,阅读,analyze,getExpr,tblRef
From: https://www.cnblogs.com/xutaoustc/p/17503720.html

相关文章

  • 【源码阅读】节点管理
     最早的节点管理是在BE节点的配置文件中写入fe节点的地址。BE节点在启动时,将知道fe节点的地址并加入集群。但是这样的机制会有一些问题,有时候一个测试节点接入到了线上集群,这种随意的操作测试会导致集群的拓扑结构不可控。节点管理的目的是对节点进行认证,实现一个节点发现和......
  • 【源码阅读】5. 元数据
     通常操作元数据时,会首先更新一条内存数据,然后写入一条元数据更新日志。这样在重启时,通过顺序回放元数据更新日志,即可在内存中重构完整的元数据。Doris一般使用BDBJE存放元数据的更新日志。在记录到达一定数量会在BDBJE中生成新的DB(本质是checkpoint分割点)............
  • 【源码阅读】90. 插件
     系统相关类PluginLoader:插件的加载类,封装了插件信息、配置加载、安装过程。包含如下组件:● PluginInfo:含有插件的基本信息● Plugin接口:插件初始化接口● AuditPlugin接口:包含审计类型插件关联的操作 初始化PluginMgr.init初始化时将构建内置插件AuditLogBuilde......
  • 【源码阅读】3. 建表
    |KW_CREATEopt_external:isExternalKW_TABLEopt_if_not_exists:ifNotExiststable_name:nameLPARENcolumn_definition_list:columnsCOMMAindex_definition_list:indexesRPARENopt_engine:engineNameopt_keys:keysopt_comment......
  • 【源码阅读】4. Stream Load 导入任务的执行流程
     FE起手路由在访问curl--location-trusted-uroot:-Ttest.csv-H"column_separator:,"http://127.0.0.1:8030/api/demo/example_tbl/_stream_load时,FE如下操作:● 检查用户名密码● 检查权限● 随机选择一个BE,Redirect到这个BE上 BE_stream_load的handler......
  • Bert Pytorch 源码分析:二、注意力层
    #注意力机制的具体模块#兼容单头和多头classAttention(nn.Module):"""Compute'ScaledDotProductAttention""" #QKV尺寸都是BS*ML*ES #(或者多头情况下是BS*HC*ML*HS,最后两维之外的维度不重要) #从输入计算QKV的过程可以统一处理,不必......
  • 【源码阅读】2. Catalog和Database
     Catalog创建|KW_CREATEKW_CATALOGopt_if_not_exists:ifNotExistsident:catalogNameopt_properties:properties{:RESULT=newCreateCatalogStmt(ifNotExists,catalogName,null,properties);:}|KW_CREATEKW_CATALOGopt_if_not_......
  • 【源码阅读】1. 配置、VARIABLE与用户PROPERTY
     配置初始化在FE启动时:● Config类ConfField注解标记的静态属性反射出Field存储到内存confFields,作为一个可读取和修改的属性列表(真正的值存储在Config类的静态属性中,反射出Field并存储到confFields只是一个读取和修改指针而已)● 读取配置文件,根据配置文件内容,设置Confi......
  • Bert PyTorch 源码分析:一、嵌入层
    #标记嵌入就是最普通的嵌入层#接受单词ID输出单词向量#直接转发给了`nn.Embedding`classTokenEmbedding(nn.Embedding):def__init__(self,vocab_size,embed_size=512):super().__init__(vocab_size,embed_size,padding_idx=0) #片段嵌入实际上是......
  • 根据上传的excel文件url,进行文件查询
    HttpResponseresponse=HttpUtil.createGet(fileUrl).setConnectionTimeout(20000).setReadTimeout(120000).timeout(3600000).execute();InputStreaminputStream=response.bodyStream();booleanxls=ExcelFileUtil.isXls(inputStream......