首页 > 代码库 > 淘宝数据库OceanBase SQL编译器部分 源码阅读--生成逻辑计划

淘宝数据库OceanBase SQL编译器部分 源码阅读--生成逻辑计划

<style>body, td { font-family: tahoma; font-size: 10pt; } </style>

淘宝数据库OceanBase SQL编译器部分 源码阅读--生成逻辑计划

SQL编译解析三部曲分为:构建语法树,生成逻辑计划,指定物理执行计划。第一步骤,在我的上一篇博客淘宝数据库OceanBase SQL编译器部分 源码阅读--解析SQL语法树里做了介绍,这篇博客主要研究第二步,生成逻辑计划。

一、 什么是逻辑计划?

我们已经知道,语法树就是一个树状的结构组织,每个节点代表一种类型的语法含义。如
update student set sex="M" where name ="小明";
这条SQL的语法树形状为:

|Update Stmt
|----Table:student
|----TargeList:
|--------sex = "M"
|----Qualifications:
|--------name="小明"

但是仅仅语法树并不能知道数据库中是否存在student这张表,这张表是否有sex,name这两个字段,我们是否有权限修改这条记录等。语法树只能判断这条SQL的写法是否正确,不能确定这条SQL是否可以执行。

逻辑计划需要明确SQL语句中所涉及到的表,字段,表达式等是否有效。这个的逻辑计划与在《数据库系统实现》等书中描述的逻辑查询计划不同。逻辑查询计划将SQL语句直接转为可运算的关系表达式。在OceanBase中,逻辑计划则只是查找或生成涉及到的表的ID,涉及字段的ID,涉及表达式的ID等,逻辑计划是不可运算的。

二、逻辑计划包含哪些内容?

简单来说,逻辑计划要弄清楚,这条SQL可以分解为几条stmt,每条stmt包含了哪些表,字段和表达式。在此基础上,如果是insert的Stmt,要加上设置哪些值;如果是update的stmt,要加上需要更新的列和对应的值,等等。

在一个逻辑计划中,每一个查询有一个唯一标识qid,每一张表有一个唯一的标识tid,每一个列有一个唯一的标识cid,每一个表达式有一个唯一的标识eid

来看OceanBase中的逻辑计划的结构(省略无关方法和变量).

 class ObLogicalPlan
    {
      //...  
      oceanbase::common::ObVector<ObStmt*> stmts_; //存储该逻辑计划的所有stmt
      oceanbase::common::ObVector<ObSqlRawExpr*> exprs_; //逻辑计划的所有表达式
      oceanbase::common::ObVector<ObRawExpr*> raw_exprs_store_;//存储逻辑计划的所有表达式
      uint64_t  new_gen_tid_;//用于生成新的tid
      uint64_t  new_gen_cid_;//用于生成新的cid
      uint64_t  new_gen_qid_;//用于生成新的qid
      uint64_t  new_gen_eid_;//用于生成新的eid
    };

oceanbase::common::ObVector是OceanBase中自己实现的泛型容器之一,作用与STL的vector相同。
stmts_存储该逻辑计划的所有stmt;
raw_exprs_store_仅仅用于存储表达式,exprs_则引用raw_exprs_store_中的内容。
new_gen_tid_等4个变量是用来生成新的标识时使用,一个逻辑是可以用多个tid,多个cid,多个eid,多个qid的。这些标识分布于存储的stmt和表达式中

注:stmt实在不知道中文该怎么称呼,就不改中文名了。

2.1 逻辑计划中表的定义


struct TableItem
{
    uint64_t    table_id_;
    common::ObString    table_name_;
    common::ObString    alias_name_;
    TableType   type_;

    uint64_t     ref_id_;
};

table_id_唯一标识一个关系表,其类型分为基本表,引用表和子查询关系。
对同一个实体表,ref_id_table_id_相同; 如果是一个引用别名的表,则table_id_是新生成的,ref_id_与这个表真正的table_id_相同;如果是一个子查询,则table_id_是新生成的,ref_id_是对子查询的引用。

对同一个实体表,它在所有线程使用的table_id_都是相同的;如果是生成的标识,则仅在该线程会话期间是唯一的。

2.2 逻辑计划中列的定义

struct ColumnItem
{
    uint64_t    column_id_;
    common::ObString    column_name_;
    uint64_t    table_id_;
    uint64_t    query_id_;

    bool        is_name_unique_;
    bool        is_group_based_;

    common::ObObjType     data_type_;
};

column_id_唯一标识一个列,table_id_query_id_为该列所属的关系表和stmt。is_name_unique_仅用在解析逻辑计划期间,标记该列的名称是否在所有表的字段中都是唯一的。is_group_based_标记该列是否用于分组。data_type_标识该列的数据类型。

2.3 逻辑计划中的表达式的定义

逻辑计划的中表达式有多种类型,其基类为ObRawExpr.包括两个成员变量,type_表示表达式的类型,result_type_表示表达式值的类型。

 class ObRawExpr
 {
 //省略其他方法
 private:
    ObItemType  type_;
    common::ObObjType result_type_;
 }

表达式分为常量表达式, 一元引用表达式,二元引用表达式,一元操作符表达式,二元操作符表达式,三元操作符表达式,多元操作符表达式,case操作符表达式,聚集函数表达式,系统函数表达式,SQL原生表达式等。继承关系如下。

namespace sql
{
     //原生表达式基类
    class ObRawExpr
    //常量表达式
    class ObConstRawExpr        : public ObRawExpr
    //一元引用表达式
    class ObUnaryRefRawExpr     : public ObRawExpr
    //二元引用表达式
    class ObBinaryRefRawExpr    : public ObRawExpr
    //一元操作符表达式
    class ObUnaryOpRawExpr      : public ObRawExpr
    //二元操作符表达式
    class ObBinaryOpRawExpr     : public ObRawExpr
     //三元操作符表达式
    class ObTripleOpRawExpr     : public ObRawExpr
    //多元操作符表达式
    class ObMultiOpRawExpr      : public ObRawExpr
    //case操作符表达式
    class ObCaseOpRawExpr       : public ObRawExpr
    //聚集函数表达式
    class ObAggFunRawExpr       : public ObRawExpr
    //系统函数表达式
    class ObSysFunRawExpr       : public ObRawExpr
    //SQL原生表达式
    class ObSqlRawExpr          : public ObRawExpr
 };

 class ObRawExpr
 {

 };

在ObLogicalPlan中,存储使用的是vector<ObRawExpr *>,使用时转为vector<ObSqlRawExpr *>.

2.4 逻辑计划中的Stmt的定义

Stmt表示一个单独的查询所包含的内容,一个逻辑计划可以包含多个Stmt.

   class ObStmt
    {
    /*省略部分内容...*/
    protected:
      common::ObVector<TableItem>    table_items_;
      common::ObVector<ColumnItem>   column_items_;

    private:
      StmtType  type_;
      uint64_t  query_id_;
      //uint64_t  where_expr_id_;
      common::ObVector<uint64_t>     where_expr_ids_;

    };

Stmt包括了一个查询所有的表table_items_,列column_items_,表达式where_expr_ids_和一个唯一的查询标识query_id_。注意这里存储的只有表达式的id,而不是表达式的实际内容。

从上述的定义总结来看,一个逻辑计划拥有多条查询实例Stmt和多个表达式,一个查询实例Stmt包含了多个表和多个列及所需表达式的引用。表,列,表达式,查询实例都有唯一的标识符进行标记。

ObLogicalPlan
----ObStmt : 1...n
--------TableItem : 0...n
--------ColnumItem : 0...n
--------expr_id_ref : 0...n
----ObRawExpr : 0...n

三、 如何制定逻辑计划?

3.1 reslove系列解析函数

制定逻辑计划的源码在build_plan.h和build_plan.cpp中,在OceanBase0.4中,则增加了dml_build_plan.h和dml_build_plan.cpp。制定逻辑对外提供的接口只有两个,解析函数resolove和销毁函数destroy_plan,其他的为自用,可以浏览下其函数声明及用途,基本的结构就是这样,因为目前OceanBase中支持的SQL语句不多,相应的解析函数也比较少,还有一些没有完成,可以想见未来还会添加更多的函数。

//解析多重查询
int resolve_multi_stmt(ResultPlan* result_plan, ParseNode* node)
//解析独立表达式
int resolve_independ_expr()
//解析and表达式
int resolve_and_exprs()
//解析表达式
int resolve_expr()
//解析聚集函数
int resolve_agg_func()
//解析join表连接
int resolve_joined_table()
//解析表
int resolve_table()
//解析from子句
int resolve_from_clause()
//解析列
int resolve_table_columns()
//解析*
int resolve_star()
//解析select的投影列表
int resolve_select_clause()
//解析where子句
int resolve_where_clause()
//解析group by子句
int resolve_group_clause()
//解析having子句
int resolve_having_clause()
//解析order子句
int resolve_order_clause()
//解析limit子句
int resolve_limit_clause()
//解析select查询
int resolve_select_stmt()
//解析delete查询
int resolve_delete_stmt()
//解析insert的插入列
int resolve_insert_columns()
//解析intsert查询的插入值
int resolve_insert_values()
//解析insert查询
int resolve_insert_stmt()
//解析update查询
int resolve_update_stmt()
//解析函数。对外提供
int resolve(ResultPlan* result_plan, ParseNode* node)
//销毁函数,对外提供
extern void destroy_plan(ResultPlan* result_plan)

resolve函数根据语法树node的类型调用不同的查询解析实例。以下是部分代码摘抄:

int resolve(ResultPlan* result_plan, ParseNode* node)
{
   /*...*/

  uint64_t query_id = OB_INVALID_ID;
  if (ret == OB_SUCCESS && node != NULL)
  {
    switch (node->type_)
    {
      case T_STMT_LIST:
      {
        ret = resolve_multi_stmt(result_plan, node);
        break;
      }
      case T_SELECT:
      {
        ret = resolve_select_stmt(result_plan, node, query_id);
        break;
      }
      case T_DELETE:
      {
        ret = resolve_delete_stmt(result_plan, node, query_id);
        break;
      }
      case T_INSERT:
      {
        ret = resolve_insert_stmt(result_plan, node, query_id);
        break;
      }
      case T_UPDATE:
      {
        ret = resolve_update_stmt(result_plan, node, query_id);
        break;
      }
      default:
        ret = OB_ERROR;
        break;
    };
  }
  return ret;
}
int resolve_update_stmt(ResultPlan* result_plan, ParseNode* node, uint64_t& query_id)
{
  int& ret = result_plan->err_stat_.err_code_ = OB_SUCCESS;
  uint64_t table_id = OB_INVALID_ID;

  query_id = OB_INVALID_ID;

  ObLogicalPlan* logical_plan  logical_plan = new(logical_plan) ObLogicalPlan(name_pool);

  result_plan->plan_tree_ = logical_plan;


  update_stmt = new(update_stmt) ObUpdateStmt(name_pool);

  query_id = logical_plan->generate_query_id();
  //为update_stmt设置新的标识qid
  update_stmt->set_query_id(query_id);

  logical_plan->add_query(update_stmt);

  ParseNode* table_node = node->children_[0];
  //解析表  
  ret = resolve_table(result_plan, update_stmt, table_node, table_id);

  update_stmt->set_update_table(table_id);

  ParseNode* assign_list = node->children_[1];

  uint64_t ref_id;
  ColumnItem *column_item = NULL;
  //解析要更新的列表,如:update student set sex="M",grade="2" where name = "xiaoming";
  for (int32_t i = 0; ret == OB_SUCCESS && i < assign_list->num_child_; i++)
  {
      ParseNode* assgin_node = assign_list->children_[i];

      /* resolve target column */
      ParseNode* column_node = assgin_node->children_[0];

      ObString column_name;
            column_name.assign_ptr(
                (char*)(column_node->str_value_), 
                static_cast<int32_t>(strlen(column_node->str_value_))
                );
      //1 根据列名获取列
      column_item = update_stmt->get_column_item(NULL, column_name);
      //2 解析列到vector<ColumnItem *>
      ret = update_stmt->add_column_item(*result_plan, column_name, NULL, &column_item);
      //3 增加列引用到update_stmt  
      ret = update_stmt->add_update_column(column_item->column_id_);

            /* resolve new value expression */
      //4 解析值表达式
      ParseNode* expr = assgin_node->children_[1];
      ret = resolve_independ_expr(result_plan, update_stmt, expr, ref_id, T_UPDATE_LIMIT);
      //5 添加值表达式引用到update_stmt
      ret = update_stmt->add_update_expr(ref_id)
  }
  //解析where子句
  ret = resolve_where_clause(result_plan, update_stmt, node->children_[2]);

  return ret;
}

我们仍旧以update语句为例。上面是根据源代码整理的逻辑,不是源码,主要是为了理清思路。

  1. 首先是创建一个新的查询update_stmt,并为其生成一个独立的查询标识qid
  2. 解析语句中的表,并将表的标识tid添加到update_stmt的引用列表
  3. 利用for循环逐个解析要更新的列-值对:
    (1). 根据列名获取列;
    (2). 将该列存储到update_stmtvector<ColumnItem *>中,并将列引用id添加到update_stmt的更新列列表ObArray<uint64_t> update_columns_中;
    (3). 解析值表达式;
    (4). 将值表达式引用id添加到更新值列表ObArray<uint64_t> update_exprs_中去;
  4. 解析where子句.

3.2 如何解析表和列?

通过上面我们知道,逻辑计划的解析的一个重要内容就是要确定查询stmt,表,列,表达式的标识.查询和表达式的标识id都可以在解析的时候生成。因为这两项不是线程共有的,但是表和列是持久的数据,可以跨线程使用同样的id。这些表和列的信息由谁来管理?

3.2.1 使用Schema

追根溯源,你会发现实体表和列的id是在ob_schema.cpp中获取的。什么是schema?schema就是数据库对象的一个集合。网上有一个很形象的比喻,我稍微做了点改动:

什么是Database,什么是Schema,什么是Table,什么是列,什么是行,什么是User?我们可以可以把Database看作是一个大仓库,仓库分了很多很多的房间,Schema就是其中的房间,一个Schema代表一个房间,Table可以看作是每个Schema中的柜子,行和列就是柜子中的格子。User就是房间的主人。

OceanBase要求schema强类型约束,也就是要预先定义好schema。这样可以方便的进行各种online ddl操作。

OceanBase的表和列信息存储在Schema的一个hash_map中。关于Schema 以后再深入了解。

四、总结

制定逻辑计划,最关键的是要理解逻辑计划的设计目标,其中最主要的内容就是确定逻辑计划中使用到的查询Stmt,表,列,表达式,并为它们生成或设置唯一标识,确保在同一个逻辑计划中是不相同的。制定逻辑计划的函数只要是reslove系列函数。而表和列的信息存储在Schema中一个hash_map中。


欢迎光临我的网站----我的博客园----我的CSDN。
如果阅读本文过程中有任何问题,请联系作者,转载请注明出处!

%23%u6DD8%u5B9D%u6570%u636E%u5E93OceanBase%20SQL%u7F16%u8BD1%u5668%u90E8%u5206%20%u6E90%u7801%u9605%u8BFB--%u751F%u6210%u903B%u8F91%u8BA1%u5212%0A%3ESQL%u7F16%u8BD1%u89E3%u6790%u4E09%u90E8%u66F2%u5206%u4E3A%uFF1A%u6784%u5EFA%u8BED%u6CD5%u6811%uFF0C%u751F%u6210%u903B%u8F91%u8BA1%u5212%uFF0C%u6307%u5B9A%u7269%u7406%u6267%u884C%u8BA1%u5212%u3002%u7B2C%u4E00%u6B65%u9AA4%uFF0C%u5728%u6211%u7684%u4E0A%u4E00%u7BC7%u535A%u5BA2%5B%u6DD8%u5B9D%u6570%u636E%u5E93OceanBase%20SQL%u7F16%u8BD1%u5668%u90E8%u5206%20%u6E90%u7801%u9605%u8BFB--%u89E3%u6790SQL%u8BED%u6CD5%u6811%5D%28http%3A//blog.csdn.net/qq910894904/article/details/28658421%29%u91CC%u505A%u4E86%u4ECB%u7ECD%uFF0C%u8FD9%u7BC7%u535A%u5BA2%u4E3B%u8981%u7814%u7A76%u7B2C%u4E8C%u6B65%uFF0C%u751F%u6210%u903B%u8F91%u8BA1%u5212%u3002%0A%0A%23%23%u4E00%u3001%20%u4EC0%u4E48%u662F%u903B%u8F91%u8BA1%u5212%uFF1F%0A%0A%u6211%u4EEC%u5DF2%u7ECF%u77E5%u9053%uFF0C%u8BED%u6CD5%u6811%u5C31%u662F%u4E00%u4E2A%u6811%u72B6%u7684%u7ED3%u6784%u7EC4%u7EC7%uFF0C%u6BCF%u4E2A%u8282%u70B9%u4EE3%u8868%u4E00%u79CD%u7C7B%u578B%u7684%u8BED%u6CD5%u542B%u4E49%u3002%u5982%0A%60update%20student%20set%20sex%3D%22M%22%20where%20name%20%3D%22%u5C0F%u660E%22%3B%60%0A%u8FD9%u6761SQL%u7684%u8BED%u6CD5%u6811%u5F62%u72B6%u4E3A%uFF1A%0A%0A%3E%7CUpdate%20Stmt%0A%7C----Table%3Astudent%0A%7C----TargeList%3A%0A%7C--------sex%20%3D%20%22M%22%0A%7C----Qualifications%3A%0A%7C--------name%3D%22%u5C0F%u660E%22%0A%0A%u4F46%u662F%u4EC5%u4EC5%u8BED%u6CD5%u6811%u5E76%u4E0D%u80FD%u77E5%u9053%u6570%u636E%u5E93%u4E2D%u662F%u5426%u5B58%u5728student%u8FD9%u5F20%u8868%uFF0C%u8FD9%u5F20%u8868%u662F%u5426%u6709sex%2Cname%u8FD9%u4E24%u4E2A%u5B57%u6BB5%uFF0C%u6211%u4EEC%u662F%u5426%u6709%u6743%u9650%u4FEE%u6539%u8FD9%u6761%u8BB0%u5F55%u7B49%u3002%u8BED%u6CD5%u6811%u53EA%u80FD%u5224%u65AD%u8FD9%u6761SQL%u7684%u5199%u6CD5%u662F%u5426%u6B63%u786E%uFF0C%u4E0D%u80FD%u786E%u5B9A%u8FD9%u6761SQL%u662F%u5426%u53EF%u4EE5%u6267%u884C%u3002%0A%0A**%u903B%u8F91%u8BA1%u5212**%u9700%u8981%u660E%u786ESQL%u8BED%u53E5%u4E2D%u6240%u6D89%u53CA%u5230%u7684%u8868%uFF0C%u5B57%u6BB5%uFF0C%u8868%u8FBE%u5F0F%u7B49%u662F%u5426%u6709%u6548%u3002%u8FD9%u4E2A%u7684%u903B%u8F91%u8BA1%u5212%u4E0E%u5728%u300A%u6570%u636E%u5E93%u7CFB%u7EDF%u5B9E%u73B0%u300B%u7B49%u4E66%u4E2D%u63CF%u8FF0%u7684%u903B%u8F91%u67E5%u8BE2%u8BA1%u5212%u4E0D%u540C%u3002%u903B%u8F91%u67E5%u8BE2%u8BA1%u5212%u5C06SQL%u8BED%u53E5%u76F4%u63A5%u8F6C%u4E3A%u53EF%u8FD0%u7B97%u7684%u5173%u7CFB%u8868%u8FBE%u5F0F%u3002%u5728OceanBase%u4E2D%uFF0C%u903B%u8F91%u8BA1%u5212%u5219%u53EA%u662F%u67E5%u627E%u6216%u751F%u6210%u6D89%u53CA%u5230%u7684%u8868%u7684ID%uFF0C%u6D89%u53CA%u5B57%u6BB5%u7684ID%uFF0C%u6D89%u53CA%u8868%u8FBE%u5F0F%u7684ID%u7B49%uFF0C%u903B%u8F91%u8BA1%u5212%u662F%u4E0D%u53EF%u8FD0%u7B97%u7684%u3002%0A%0A%23%23%u4E8C%u3001%u903B%u8F91%u8BA1%u5212%u5305%u542B%u54EA%u4E9B%u5185%u5BB9%uFF1F%0A%0A%u7B80%u5355%u6765%u8BF4%uFF0C%u903B%u8F91%u8BA1%u5212%u8981%u5F04%u6E05%u695A%uFF0C%u8FD9%u6761SQL%u53EF%u4EE5%u5206%u89E3%u4E3A%u51E0%u6761stmt%2C%u6BCF%u6761stmt%u5305%u542B%u4E86%u54EA%u4E9B%u8868%uFF0C%u5B57%u6BB5%u548C%u8868%u8FBE%u5F0F%u3002%u5728%u6B64%u57FA%u7840%u4E0A%uFF0C%u5982%u679C%u662Finsert%u7684Stmt%uFF0C%u8981%u52A0%u4E0A%u8BBE%u7F6E%u54EA%u4E9B%u503C%3B%u5982%u679C%u662Fupdate%u7684stmt%2C%u8981%u52A0%u4E0A%u9700%u8981%u66F4%u65B0%u7684%u5217%u548C%u5BF9%u5E94%u7684%u503C%uFF0C%u7B49%u7B49%u3002%0A%0A**%u5728%u4E00%u4E2A%u903B%u8F91%u8BA1%u5212%u4E2D%uFF0C%u6BCF%u4E00%u4E2A%u67E5%u8BE2%u6709%u4E00%u4E2A%u552F%u4E00%u6807%u8BC6qid%2C%u6BCF%u4E00%u5F20%u8868%u6709%u4E00%u4E2A%u552F%u4E00%u7684%u6807%u8BC6tid%2C%u6BCF%u4E00%u4E2A%u5217%u6709%u4E00%u4E2A%u552F%u4E00%u7684%u6807%u8BC6cid%2C%u6BCF%u4E00%u4E2A%u8868%u8FBE%u5F0F%u6709%u4E00%u4E2A%u552F%u4E00%u7684%u6807%u8BC6eid**%u3002%0A%0A%u6765%u770BOceanBase%u4E2D%u7684%u903B%u8F91%u8BA1%u5212%u7684%u7ED3%u6784%uFF08%u7701%u7565%u65E0%u5173%u65B9%u6CD5%u548C%u53D8%u91CF%29.%0A%0A%60%60%60%0A%20class%20ObLogicalPlan%0A%20%20%20%20%7B%0A%20%20%20%20%20%20//...%20%20%0A%20%20%20%20%20%20oceanbase%3A%3Acommon%3A%3AObVector%3CObStmt*%3E%20stmts_%3B%20//%u5B58%u50A8%u8BE5%u903B%u8F91%u8BA1%u5212%u7684%u6240%u6709stmt%0A%20%20%20%20%20%20oceanbase%3A%3Acommon%3A%3AObVector%3CObSqlRawExpr*%3E%20exprs_%3B%20//%u903B%u8F91%u8BA1%u5212%u7684%u6240%u6709%u8868%u8FBE%u5F0F%0A%20%20%20%20%20%20oceanbase%3A%3Acommon%3A%3AObVector%3CObRawExpr*%3E%20raw_exprs_store_%3B//%u5B58%u50A8%u903B%u8F91%u8BA1%u5212%u7684%u6240%u6709%u8868%u8FBE%u5F0F%0A%20%20%20%20%20%20uint64_t%20%20new_gen_tid_%3B//%u7528%u4E8E%u751F%u6210%u65B0%u7684tid%0A%20%20%20%20%20%20uint64_t%20%20new_gen_cid_%3B//%u7528%u4E8E%u751F%u6210%u65B0%u7684cid%0A%20%20%20%20%20%20uint64_t%20%20new_gen_qid_%3B//%u7528%u4E8E%u751F%u6210%u65B0%u7684qid%0A%20%20%20%20%20%20uint64_t%20%20new_gen_eid_%3B//%u7528%u4E8E%u751F%u6210%u65B0%u7684eid%0A%20%20%20%20%7D%3B%0A%60%60%60%0A%60oceanbase%3A%3Acommon%3A%3AObVector%60%u662FOceanBase%u4E2D%u81EA%u5DF1%u5B9E%u73B0%u7684%u6CDB%u578B%u5BB9%u5668%u4E4B%u4E00%uFF0C%u4F5C%u7528%u4E0ESTL%u7684vector%u76F8%u540C%u3002%0A%60stmts_%60%u5B58%u50A8%u8BE5%u903B%u8F91%u8BA1%u5212%u7684%u6240%u6709stmt%3B%0A**%60raw_exprs_store_%60%u4EC5%u4EC5%u7528%u4E8E%u5B58%u50A8%u8868%u8FBE%u5F0F%uFF0C%60exprs_%60%u5219%u5F15%u7528%60raw_exprs_store_%60%u4E2D%u7684%u5185%u5BB9%u3002**%0A**%60new_gen_tid_%60%u7B494%u4E2A%u53D8%u91CF%u662F%u7528%u6765%u751F%u6210%u65B0%u7684%u6807%u8BC6%u65F6%u4F7F%u7528%uFF0C%u4E00%u4E2A%u903B%u8F91%u662F%u53EF%u4EE5%u7528%u591A%u4E2Atid%2C%u591A%u4E2Acid%2C%u591A%u4E2Aeid%uFF0C%u591A%u4E2Aqid%u7684%u3002%u8FD9%u4E9B%u6807%u8BC6%u5206%u5E03%u4E8E%u5B58%u50A8%u7684stmt%u548C%u8868%u8FBE%u5F0F%u4E2D**%u3002%0A%0A_%u6CE8%uFF1Astmt%u5B9E%u5728%u4E0D%u77E5%u9053%u4E2D%u6587%u8BE5%u600E%u4E48%u79F0%u547C%uFF0C%u5C31%u4E0D%u6539%u4E2D%u6587%u540D%u4E86%u3002_%0A%0A%23%23%232.1%20%u903B%u8F91%u8BA1%u5212%u4E2D%u8868%u7684%u5B9A%u4E49%20%20%20%20%20%20%20%20%20%20%20%20%0A%60%60%60%0A%0Astruct%20TableItem%0A%7B%0A%20%20%20%20uint64_t%20%20%20%20table_id_%3B%0A%20%20%20%20common%3A%3AObString%20%20%20%20table_name_%3B%0A%20%20%20%20common%3A%3AObString%20%20%20%20alias_name_%3B%0A%20%20%20%20TableType%20%20%20type_%3B%0A%20%20%20%20%0A%20%20%20%20uint64_t%20%20%20%20%20ref_id_%3B%0A%7D%3B%0A%60%60%60%0A%60table_id_%60%u552F%u4E00%u6807%u8BC6%u4E00%u4E2A%u5173%u7CFB%u8868%uFF0C%u5176%u7C7B%u578B%u5206%u4E3A%u57FA%u672C%u8868%uFF0C%u5F15%u7528%u8868%u548C%u5B50%u67E5%u8BE2%u5173%u7CFB%u3002%0A%u5BF9%u540C%u4E00%u4E2A%u5B9E%u4F53%u8868%2C%60ref_id_%60%u4E0E%60table_id_%60%u76F8%u540C%3B%20%u5982%u679C%u662F%u4E00%u4E2A%u5F15%u7528%u522B%u540D%u7684%u8868%uFF0C%u5219%60table_id_%60%u662F%u65B0%u751F%u6210%u7684%uFF0C%60ref_id_%60%u4E0E%u8FD9%u4E2A%u8868%u771F%u6B63%u7684%60table_id_%60%u76F8%u540C%3B%u5982%u679C%u662F%u4E00%u4E2A%u5B50%u67E5%u8BE2%uFF0C%u5219%60table_id_%60%u662F%u65B0%u751F%u6210%u7684%2C%60ref_id_%60%u662F%u5BF9%u5B50%u67E5%u8BE2%u7684%u5F15%u7528%u3002%0A%0A%u5BF9%u540C%u4E00%u4E2A%u5B9E%u4F53%u8868%uFF0C%u5B83%u5728%u6240%u6709%u7EBF%u7A0B%u4F7F%u7528%u7684%60table_id_%60%u90FD%u662F%u76F8%u540C%u7684%uFF1B%u5982%u679C%u662F%u751F%u6210%u7684%u6807%u8BC6%uFF0C%u5219%u4EC5%u5728%u8BE5%u7EBF%u7A0B%u4F1A%u8BDD%u671F%u95F4%u662F%u552F%u4E00%u7684%u3002%0A%0A%0A%0A%23%23%232.2%20%u903B%u8F91%u8BA1%u5212%u4E2D%u5217%u7684%u5B9A%u4E49%0A%60%60%60%0Astruct%20ColumnItem%0A%7B%0A%20%20%20%20uint64_t%20%20%20%20column_id_%3B%0A%20%20%20%20common%3A%3AObString%20%20%20%20column_name_%3B%0A%20%20%20%20uint64_t%20%20%20%20table_id_%3B%0A%20%20%20%20uint64_t%20%20%20%20query_id_%3B%0A%20%20%0A%20%20%20%20bool%20%20%20%20%20%20%20%20is_name_unique_%3B%0A%20%20%20%20bool%20%20%20%20%20%20%20%20is_group_based_%3B%0A%20%20%20%20%0A%20%20%20%20common%3A%3AObObjType%20%20%20%20%20data_type_%3B%0A%7D%3B%0A%60%60%60%0A%60column_id_%60%u552F%u4E00%u6807%u8BC6%u4E00%u4E2A%u5217%uFF0C%60table_id_%60%u548C%60query_id_%60%u4E3A%u8BE5%u5217%u6240%u5C5E%u7684%u5173%u7CFB%u8868%u548Cstmt%u3002%60is_name_unique_%60%u4EC5%u7528%u5728%u89E3%u6790%u903B%u8F91%u8BA1%u5212%u671F%u95F4%uFF0C%u6807%u8BB0%u8BE5%u5217%u7684%u540D%u79F0%u662F%u5426%u5728%u6240%u6709%u8868%u7684%u5B57%u6BB5%u4E2D%u90FD%u662F%u552F%u4E00%u7684%u3002%60is_group_based_%60%u6807%u8BB0%u8BE5%u5217%u662F%u5426%u7528%u4E8E%u5206%u7EC4%u3002%60data_type_%60%u6807%u8BC6%u8BE5%u5217%u7684%u6570%u636E%u7C7B%u578B%u3002%0A%0A%23%23%232.3%20%u903B%u8F91%u8BA1%u5212%u4E2D%u7684%u8868%u8FBE%u5F0F%u7684%u5B9A%u4E49%0A%0A%u903B%u8F91%u8BA1%u5212%u7684%u4E2D%u8868%u8FBE%u5F0F%u6709%u591A%u79CD%u7C7B%u578B%uFF0C%u5176%u57FA%u7C7B%u4E3AObRawExpr.%u5305%u62EC%u4E24%u4E2A%u6210%u5458%u53D8%u91CF%uFF0C%60type_%60%u8868%u793A%u8868%u8FBE%u5F0F%u7684%u7C7B%u578B%uFF0C%60result_type_%60%u8868%u793A%u8868%u8FBE%u5F0F%u503C%u7684%u7C7B%u578B%u3002%0A%0A%20%60%60%60%0A%20class%20ObRawExpr%0A%20%7B%0A%20//%u7701%u7565%u5176%u4ED6%u65B9%u6CD5%0A%20private%3A%0A%20%20%20%20ObItemType%20%20type_%3B%0A%20%20%20%20common%3A%3AObObjType%20result_type_%3B%0A%20%7D%0A%20%60%60%60%0A%u8868%u8FBE%u5F0F%u5206%u4E3A%u5E38%u91CF%u8868%u8FBE%u5F0F%2C%20%u4E00%u5143%u5F15%u7528%u8868%u8FBE%u5F0F%uFF0C%u4E8C%u5143%u5F15%u7528%u8868%u8FBE%u5F0F%uFF0C%u4E00%u5143%u64CD%u4F5C%u7B26%u8868%u8FBE%u5F0F%uFF0C%u4E8C%u5143%u64CD%u4F5C%u7B26%u8868%u8FBE%u5F0F%uFF0C%u4E09%u5143%u64CD%u4F5C%u7B26%u8868%u8FBE%u5F0F%uFF0C%u591A%u5143%u64CD%u4F5C%u7B26%u8868%u8FBE%u5F0F%uFF0Ccase%u64CD%u4F5C%u7B26%u8868%u8FBE%u5F0F%uFF0C%u805A%u96C6%u51FD%u6570%u8868%u8FBE%u5F0F%uFF0C%u7CFB%u7EDF%u51FD%u6570%u8868%u8FBE%u5F0F%uFF0CSQL%u539F%u751F%u8868%u8FBE%u5F0F%u7B49%u3002%u7EE7%u627F%u5173%u7CFB%u5982%u4E0B%u3002%0A%60%60%60%0Anamespace%20sql%0A%7B%0A%20%20%20%20%20//%u539F%u751F%u8868%u8FBE%u5F0F%u57FA%u7C7B%0A%20%20%20%20class%20ObRawExpr%0A%20%20%20%20//%u5E38%u91CF%u8868%u8FBE%u5F0F%0A%20%20%20%20class%20ObConstRawExpr%20%20%20%20%20%20%20%20%3A%20public%20ObRawExpr%0A%20%20%20%20//%u4E00%u5143%u5F15%u7528%u8868%u8FBE%u5F0F%0A%20%20%20%20class%20ObUnaryRefRawExpr%20%20%20%20%20%3A%20public%20ObRawExpr%0A%20%20%20%20//%u4E8C%u5143%u5F15%u7528%u8868%u8FBE%u5F0F%0A%20%20%20%20class%20ObBinaryRefRawExpr%20%20%20%20%3A%20public%20ObRawExpr%0A%20%20%20%20//%u4E00%u5143%u64CD%u4F5C%u7B26%u8868%u8FBE%u5F0F%0A%20%20%20%20class%20ObUnaryOpRawExpr%20%20%20%20%20%20%3A%20public%20ObRawExpr%0A%20%20%20%20//%u4E8C%u5143%u64CD%u4F5C%u7B26%u8868%u8FBE%u5F0F%0A%20%20%20%20class%20ObBinaryOpRawExpr%20%20%20%20%20%3A%20public%20ObRawExpr%0A%20%20%20%20%20//%u4E09%u5143%u64CD%u4F5C%u7B26%u8868%u8FBE%u5F0F%0A%20%20%20%20class%20ObTripleOpRawExpr%20%20%20%20%20%3A%20public%20ObRawExpr%0A%20%20%20%20//%u591A%u5143%u64CD%u4F5C%u7B26%u8868%u8FBE%u5F0F%0A%20%20%20%20class%20ObMultiOpRawExpr%20%20%20%20%20%20%3A%20public%20ObRawExpr%0A%20%20%20%20//case%u64CD%u4F5C%u7B26%u8868%u8FBE%u5F0F%0A%20%20%20%20class%20ObCaseOpRawExpr%20%20%20%20%20%20%20%3A%20public%20ObRawExpr%0A%20%20%20%20//%u805A%u96C6%u51FD%u6570%u8868%u8FBE%u5F0F%0A%20%20%20%20class%20ObAggFunRawExpr%20%20%20%20%20%20%20%3A%20public%20ObRawExpr%0A%20%20%20%20//%u7CFB%u7EDF%u51FD%u6570%u8868%u8FBE%u5F0F%0A%20%20%20%20class%20ObSysFunRawExpr%20%20%20%20%20%20%20%3A%20public%20ObRawExpr%0A%20%20%20%20//SQL%u539F%u751F%u8868%u8FBE%u5F0F%0A%20%20%20%20class%20ObSqlRawExpr%20%20%20%20%20%20%20%20%20%20%3A%20public%20ObRawExpr%0A%20%7D%3B%0A%20%0A%20class%20ObRawExpr%0A%20%7B%0A%20%20%20%20%20%0A%20%7D%3B%0A%20%60%60%60%0A%20%u5728ObLogicalPlan%u4E2D%uFF0C%u5B58%u50A8%u4F7F%u7528%u7684%u662F%60vector%3CObRawExpr%20*%3E%60%2C%u4F7F%u7528%u65F6%u8F6C%u4E3A%60vector%3CObSqlRawExpr%20*%3E%60.%0A%20%0A%20%23%23%232.4%20%u903B%u8F91%u8BA1%u5212%u4E2D%u7684Stmt%u7684%u5B9A%u4E49%0A%20%0A%20Stmt%u8868%u793A%u4E00%u4E2A%u5355%u72EC%u7684%u67E5%u8BE2%u6240%u5305%u542B%u7684%u5185%u5BB9%uFF0C%u4E00%u4E2A%u903B%u8F91%u8BA1%u5212%u53EF%u4EE5%u5305%u542B%u591A%u4E2AStmt.%0A%20%60%60%60%0A%20%20%20class%20ObStmt%0A%20%20%20%20%7B%0A%20%20%20%20/*%u7701%u7565%u90E8%u5206%u5185%u5BB9...*/%0A%20%20%20%20protected%3A%0A%20%20%20%20%20%20common%3A%3AObVector%3CTableItem%3E%20%20%20%20table_items_%3B%0A%20%20%20%20%20%20common%3A%3AObVector%3CColumnItem%3E%20%20%20column_items_%3B%0A%0A%20%20%20%20private%3A%0A%20%20%20%20%20%20StmtType%20%20type_%3B%0A%20%20%20%20%20%20uint64_t%20%20query_id_%3B%0A%20%20%20%20%20%20//uint64_t%20%20where_expr_id_%3B%0A%20%20%20%20%20%20common%3A%3AObVector%3Cuint64_t%3E%20%20%20%20%20where_expr_ids_%3B%0A%0A%20%20%20%20%7D%3B%0A%20%60%60%60%0A%20%0A%20Stmt%u5305%u62EC%u4E86%u4E00%u4E2A%u67E5%u8BE2%u6240%u6709%u7684%u8868%60table_items_%60%2C%u5217%60column_items_%60%2C%u8868%u8FBE%u5F0F%60where_expr_ids_%60%u548C%u4E00%u4E2A%u552F%u4E00%u7684%u67E5%u8BE2%u6807%u8BC6%60query_id_%60%u3002%u6CE8%u610F%u8FD9%u91CC%u5B58%u50A8%u7684%u53EA%u6709%u8868%u8FBE%u5F0F%u7684id%2C%u800C%u4E0D%u662F%u8868%u8FBE%u5F0F%u7684%u5B9E%u9645%u5185%u5BB9%u3002%0A%20%0A%20%u4ECE%u4E0A%u8FF0%u7684%u5B9A%u4E49%u603B%u7ED3%u6765%u770B%uFF0C%u4E00%u4E2A%u903B%u8F91%u8BA1%u5212%u62E5%u6709%u591A%u6761%u67E5%u8BE2%u5B9E%u4F8BStmt%u548C%u591A%u4E2A%u8868%u8FBE%u5F0F%uFF0C%u4E00%u4E2A%u67E5%u8BE2%u5B9E%u4F8BStmt%u5305%u542B%u4E86%u591A%u4E2A%u8868%u548C%u591A%u4E2A%u5217%u53CA%u6240%u9700%u8868%u8FBE%u5F0F%u7684%u5F15%u7528%u3002%u8868%uFF0C%u5217%uFF0C%u8868%u8FBE%u5F0F%uFF0C%u67E5%u8BE2%u5B9E%u4F8B%u90FD%u6709%u552F%u4E00%u7684%u6807%u8BC6%u7B26%u8FDB%u884C%u6807%u8BB0%u3002%0A%3E%20%0A%20**ObLogicalPlan**%0A%20----**ObStmt**%20%3A%201...n%0A%20--------**TableItem**%20%3A%200...n%0A%20--------**ColnumItem**%20%3A%200...n%0A%20--------**expr_id_ref**%20%3A%200...n%0A%20----**ObRawExpr**%20%3A%200...n%0A%0A%23%23%u4E09%u3001%20%u5982%u4F55%u5236%u5B9A%u903B%u8F91%u8BA1%u5212%uFF1F%0A%0A%23%23%233.1%20reslove%u7CFB%u5217%u89E3%u6790%u51FD%u6570%0A%u5236%u5B9A%u903B%u8F91%u8BA1%u5212%u7684%u6E90%u7801%u5728build_plan.h%u548Cbuild_plan.cpp%u4E2D%uFF0C%u5728OceanBase0.4%u4E2D%uFF0C%u5219%u589E%u52A0%u4E86dml_build_plan.h%u548Cdml_build_plan.cpp%u3002%u5236%u5B9A%u903B%u8F91%u5BF9%u5916%u63D0%u4F9B%u7684%u63A5%u53E3%u53EA%u6709%u4E24%u4E2A%2C%u89E3%u6790%u51FD%u6570%60resolove%60%u548C%u9500%u6BC1%u51FD%u6570%60destroy_plan%60%2C%u5176%u4ED6%u7684%u4E3A%u81EA%u7528%uFF0C%u53EF%u4EE5%u6D4F%u89C8%u4E0B%u5176%u51FD%u6570%u58F0%u660E%u53CA%u7528%u9014%uFF0C%u57FA%u672C%u7684%u7ED3%u6784%u5C31%u662F%u8FD9%u6837%uFF0C%u56E0%u4E3A%u76EE%u524DOceanBase%u4E2D%u652F%u6301%u7684SQL%u8BED%u53E5%u4E0D%u591A%uFF0C%u76F8%u5E94%u7684%u89E3%u6790%u51FD%u6570%u4E5F%u6BD4%u8F83%u5C11%uFF0C%u8FD8%u6709%u4E00%u4E9B%u6CA1%u6709%u5B8C%u6210%uFF0C%u53EF%u4EE5%u60F3%u89C1%u672A%u6765%u8FD8%u4F1A%u6DFB%u52A0%u66F4%u591A%u7684%u51FD%u6570%u3002%0A%0A%60%60%60%0A//%u89E3%u6790%u591A%u91CD%u67E5%u8BE2%0Aint%20resolve_multi_stmt%28ResultPlan*%20result_plan%2C%20ParseNode*%20node%29%0A//%u89E3%u6790%u72EC%u7ACB%u8868%u8FBE%u5F0F%0Aint%20resolve_independ_expr%28%29%0A//%u89E3%u6790and%u8868%u8FBE%u5F0F%0Aint%20resolve_and_exprs%28%29%0A//%u89E3%u6790%u8868%u8FBE%u5F0F%0Aint%20resolve_expr%28%29%0A//%u89E3%u6790%u805A%u96C6%u51FD%u6570%0Aint%20resolve_agg_func%28%29%0A//%u89E3%u6790join%u8868%u8FDE%u63A5%0Aint%20resolve_joined_table%28%29%0A//%u89E3%u6790%u8868%0Aint%20resolve_table%28%29%0A//%u89E3%u6790from%u5B50%u53E5%0Aint%20resolve_from_clause%28%29%0A//%u89E3%u6790%u5217%0Aint%20resolve_table_columns%28%29%0A//%u89E3%u6790*%0Aint%20resolve_star%28%29%0A//%u89E3%u6790select%u7684%u6295%u5F71%u5217%u8868%0Aint%20resolve_select_clause%28%29%0A//%u89E3%u6790where%u5B50%u53E5%0Aint%20resolve_where_clause%28%29%0A//%u89E3%u6790group%20by%u5B50%u53E5%0Aint%20resolve_group_clause%28%29%0A//%u89E3%u6790having%u5B50%u53E5%0Aint%20resolve_having_clause%28%29%0A//%u89E3%u6790order%u5B50%u53E5%0Aint%20resolve_order_clause%28%29%0A//%u89E3%u6790limit%u5B50%u53E5%0Aint%20resolve_limit_clause%28%29%0A//%u89E3%u6790select%u67E5%u8BE2%0Aint%20resolve_select_stmt%28%29%0A//%u89E3%u6790delete%u67E5%u8BE2%0Aint%20resolve_delete_stmt%28%29%0A//%u89E3%u6790insert%u7684%u63D2%u5165%u5217%0Aint%20resolve_insert_columns%28%29%0A//%u89E3%u6790intsert%u67E5%u8BE2%u7684%u63D2%u5165%u503C%0Aint%20resolve_insert_values%28%29%0A//%u89E3%u6790insert%u67E5%u8BE2%0Aint%20resolve_insert_stmt%28%29%0A//%u89E3%u6790update%u67E5%u8BE2%0Aint%20resolve_update_stmt%28%29%0A//%u89E3%u6790%u51FD%u6570%u3002%u5BF9%u5916%u63D0%u4F9B%0Aint%20resolve%28ResultPlan*%20result_plan%2C%20ParseNode*%20node%29%0A//%u9500%u6BC1%u51FD%u6570%uFF0C%u5BF9%u5916%u63D0%u4F9B%0Aextern%20void%20destroy_plan%28ResultPlan*%20result_plan%29%0A%60%60%60%0A%0A%0Aresolve%u51FD%u6570%u6839%u636E%u8BED%u6CD5%u6811node%u7684%u7C7B%u578B%u8C03%u7528%u4E0D%u540C%u7684%u67E5%u8BE2%u89E3%u6790%u5B9E%u4F8B%u3002%u4EE5%u4E0B%u662F%u90E8%u5206%u4EE3%u7801%u6458%u6284%uFF1A%0A%0A%60%60%60%0Aint%20resolve%28ResultPlan*%20result_plan%2C%20ParseNode*%20node%29%0A%7B%0A%20%20%20/*...*/%0A%0A%20%20uint64_t%20query_id%20%3D%20OB_INVALID_ID%3B%0A%20%20if%20%28ret%20%3D%3D%20OB_SUCCESS%20%26%26%20node%20%21%3D%20NULL%29%0A%20%20%7B%0A%20%20%20%20switch%20%28node-%3Etype_%29%0A%20%20%20%20%7B%0A%20%20%20%20%20%20case%20T_STMT_LIST%3A%0A%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20ret%20%3D%20resolve_multi_stmt%28result_plan%2C%20node%29%3B%0A%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20case%20T_SELECT%3A%0A%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20ret%20%3D%20resolve_select_stmt%28result_plan%2C%20node%2C%20query_id%29%3B%0A%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20case%20T_DELETE%3A%0A%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20ret%20%3D%20resolve_delete_stmt%28result_plan%2C%20node%2C%20query_id%29%3B%0A%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20case%20T_INSERT%3A%0A%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20ret%20%3D%20resolve_insert_stmt%28result_plan%2C%20node%2C%20query_id%29%3B%0A%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20case%20T_UPDATE%3A%0A%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20ret%20%3D%20resolve_update_stmt%28result_plan%2C%20node%2C%20query_id%29%3B%0A%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20default%3A%0A%20%20%20%20%20%20%20%20ret%20%3D%20OB_ERROR%3B%0A%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%7D%3B%0A%20%20%7D%0A%20%20return%20ret%3B%0A%7D%0Aint%20resolve_update_stmt%28ResultPlan*%20result_plan%2C%20ParseNode*%20node%2C%20uint64_t%26%20query_id%29%0A%7B%0A%20%20int%26%20ret%20%3D%20result_plan-%3Eerr_stat_.err_code_%20%3D%20OB_SUCCESS%3B%0A%20%20uint64_t%20table_id%20%3D%20OB_INVALID_ID%3B%0A%0A%20%20query_id%20%3D%20OB_INVALID_ID%3B%0A%0A%20%20ObLogicalPlan*%20logical_plan%20%20logical_plan%20%3D%20new%28logical_plan%29%20ObLogicalPlan%28name_pool%29%3B%0A%20%20%0A%20%20result_plan-%3Eplan_tree_%20%3D%20logical_plan%3B%0A%20%0A%20%20%0A%20%20update_stmt%20%3D%20new%28update_stmt%29%20ObUpdateStmt%28name_pool%29%3B%0A%20%20%0A%20%20query_id%20%3D%20logical_plan-%3Egenerate_query_id%28%29%3B%0A%20%20//%u4E3Aupdate_stmt%u8BBE%u7F6E%u65B0%u7684%u6807%u8BC6qid%0A%20%20update_stmt-%3Eset_query_id%28query_id%29%3B%0A%20%20%0A%20%20logical_plan-%3Eadd_query%28update_stmt%29%3B%0A%20%20%0A%20%20ParseNode*%20table_node%20%3D%20node-%3Echildren_%5B0%5D%3B%0A%20%20//%u89E3%u6790%u8868%20%20%0A%20%20ret%20%3D%20resolve_table%28result_plan%2C%20update_stmt%2C%20table_node%2C%20table_id%29%3B%0A%20%20%20%20%0A%20%20update_stmt-%3Eset_update_table%28table_id%29%3B%0A%20%20%0A%20%20ParseNode*%20assign_list%20%3D%20node-%3Echildren_%5B1%5D%3B%0A%20%20%0A%20%20uint64_t%20ref_id%3B%0A%20%20ColumnItem%20*column_item%20%3D%20NULL%3B%0A%20%20//%u89E3%u6790%u8981%u66F4%u65B0%u7684%u5217%u8868%uFF0C%u5982%3Aupdate%20student%20set%20sex%3D%22M%22%2Cgrade%3D%222%22%20where%20name%20%3D%20%22xiaoming%22%3B%0A%20%20for%20%28int32_t%20i%20%3D%200%3B%20ret%20%3D%3D%20OB_SUCCESS%20%26%26%20i%20%3C%20assign_list-%3Enum_child_%3B%20i++%29%0A%20%20%7B%0A%20%20%20%20%20%20ParseNode*%20assgin_node%20%3D%20assign_list-%3Echildren_%5Bi%5D%3B%0A%20%20%20%20%0A%20%20%20%20%20%20/*%20resolve%20target%20column%20*/%0A%20%20%20%20%20%20ParseNode*%20column_node%20%3D%20assgin_node-%3Echildren_%5B0%5D%3B%0A%0A%20%20%20%20%20%20ObString%20column_name%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20column_name.assign_ptr%28%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%28char*%29%28column_node-%3Estr_value_%29%2C%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20static_cast%3Cint32_t%3E%28strlen%28column_node-%3Estr_value_%29%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%29%3B%0A%20%20%20%20%20%20//1%20%u6839%u636E%u5217%u540D%u83B7%u53D6%u5217%0A%20%20%20%20%20%20column_item%20%3D%20update_stmt-%3Eget_column_item%28NULL%2C%20column_name%29%3B%0A%20%20%20%20%20%20//2%20%u89E3%u6790%u5217%u5230vector%3CColumnItem%20*%3E%0A%20%20%20%20%20%20ret%20%3D%20update_stmt-%3Eadd_column_item%28*result_plan%2C%20column_name%2C%20NULL%2C%20%26column_item%29%3B%0A%20%20%20%20%20%20//3%20%u589E%u52A0%u5217%u5F15%u7528%u5230update_stmt%20%20%0A%20%20%20%20%20%20ret%20%3D%20update_stmt-%3Eadd_update_column%28column_item-%3Ecolumn_id_%29%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20/*%20resolve%20new%20value%20expression%20*/%0A%20%20%20%20%20%20//4%20%u89E3%u6790%u503C%u8868%u8FBE%u5F0F%0A%20%20%20%20%20%20ParseNode*%20expr%20%3D%20assgin_node-%3Echildren_%5B1%5D%3B%0A%20%20%20%20%20%20ret%20%3D%20resolve_independ_expr%28result_plan%2C%20update_stmt%2C%20expr%2C%20ref_id%2C%20T_UPDATE_LIMIT%29%3B%0A%20%20%20%20%20%20//5%20%u6DFB%u52A0%u503C%u8868%u8FBE%u5F0F%u5F15%u7528%u5230update_stmt%0A%20%20%20%20%20%20ret%20%3D%20update_stmt-%3Eadd_update_expr%28ref_id%29%0A%20%20%7D%0A%20%20//%u89E3%u6790where%u5B50%u53E5%0A%20%20ret%20%3D%20resolve_where_clause%28result_plan%2C%20update_stmt%2C%20node-%3Echildren_%5B2%5D%29%3B%0A%20%20%20%20%20%0A%20%20return%20ret%3B%0A%7D%0A%60%60%60%0A%0A%u6211%u4EEC%u4ECD%u65E7%u4EE5update%u8BED%u53E5%u4E3A%u4F8B%u3002%u4E0A%u9762%u662F%u6839%u636E%u6E90%u4EE3%u7801%u6574%u7406%u7684%u903B%u8F91%uFF0C%u4E0D%u662F%u6E90%u7801%uFF0C%u4E3B%u8981%u662F%u4E3A%u4E86%u7406%u6E05%u601D%u8DEF%u3002%0A%0A1.%20%u9996%u5148%u662F%u521B%u5EFA%u4E00%u4E2A%u65B0%u7684%u67E5%u8BE2update_stmt%uFF0C%u5E76%u4E3A%u5176%u751F%u6210%u4E00%u4E2A%u72EC%u7ACB%u7684%u67E5%u8BE2%u6807%u8BC6qid%0A2.%20%u89E3%u6790%u8BED%u53E5%u4E2D%u7684%u8868%uFF0C%u5E76%u5C06%u8868%u7684%u6807%u8BC6tid%u6DFB%u52A0%u5230update_stmt%u7684%u5F15%u7528%u5217%u8868%0A3.%20%u5229%u7528for%u5FAA%u73AF%u9010%u4E2A%u89E3%u6790%u8981%u66F4%u65B0%u7684%u5217-%u503C%u5BF9%uFF1A%0A%20%20%20%20%281%29.%20%u6839%u636E%u5217%u540D%u83B7%u53D6%u5217%3B%0A%20%20%20%20%282%29.%20%u5C06%u8BE5%u5217%u5B58%u50A8%u5230%60update_stmt%60%u7684%60vector%3CColumnItem%20*%3E%60%u4E2D%2C%u5E76%u5C06%u5217%u5F15%u7528id%u6DFB%u52A0%u5230%60update_stmt%60%u7684%u66F4%u65B0%u5217%u5217%u8868%60ObArray%3Cuint64_t%3E%20update_columns_%60%u4E2D%3B%0A%20%20%20%20%283%29.%20%u89E3%u6790%u503C%u8868%u8FBE%u5F0F%3B%0A%20%20%20%20%284%29.%20%u5C06%u503C%u8868%u8FBE%u5F0F%u5F15%u7528id%u6DFB%u52A0%u5230%u66F4%u65B0%u503C%u5217%u8868%60ObArray%3Cuint64_t%3E%20update_exprs_%60%u4E2D%u53BB%3B%0A4.%20%u89E3%u6790where%u5B50%u53E5.%0A%0A%23%23%233.2%20%u5982%u4F55%u89E3%u6790%u8868%u548C%u5217%uFF1F%0A%0A%u901A%u8FC7%u4E0A%u9762%u6211%u4EEC%u77E5%u9053%uFF0C%u903B%u8F91%u8BA1%u5212%u7684%u89E3%u6790%u7684%u4E00%u4E2A%u91CD%u8981%u5185%u5BB9%u5C31%u662F%u8981%u786E%u5B9A%u67E5%u8BE2stmt%2C%u8868%uFF0C%u5217%uFF0C%u8868%u8FBE%u5F0F%u7684%u6807%u8BC6.%u67E5%u8BE2%u548C%u8868%u8FBE%u5F0F%u7684%u6807%u8BC6id%u90FD%u53EF%u4EE5%u5728%u89E3%u6790%u7684%u65F6%u5019%u751F%u6210%u3002%u56E0%u4E3A%u8FD9%u4E24%u9879%u4E0D%u662F%u7EBF%u7A0B%u5171%u6709%u7684%uFF0C%u4F46%u662F%u8868%u548C%u5217%u662F%u6301%u4E45%u7684%u6570%u636E%uFF0C%u53EF%u4EE5%u8DE8%u7EBF%u7A0B%u4F7F%u7528%u540C%u6837%u7684id%u3002%u8FD9%u4E9B%u8868%u548C%u5217%u7684%u4FE1%u606F%u7531%u8C01%u6765%u7BA1%u7406%uFF1F%0A%0A%23%23%23%233.2.1%20%u4F7F%u7528Schema%0A%0A%u8FFD%u6839%u6EAF%u6E90%uFF0C%u4F60%u4F1A%u53D1%u73B0%u5B9E%u4F53%u8868%u548C%u5217%u7684id%u662F%u5728%60ob_schema.cpp%60%u4E2D%u83B7%u53D6%u7684%u3002%u4EC0%u4E48%u662Fschema%uFF1F**schema%u5C31%u662F%u6570%u636E%u5E93%u5BF9%u8C61%u7684%u4E00%u4E2A%u96C6%u5408**%u3002%u7F51%u4E0A%u6709%u4E00%u4E2A%u5F88%u5F62%u8C61%u7684%5B%u6BD4%u55BB%5D%28http%3A//blog.csdn.net/jackyren007/article/details/4855049%29%2C%u6211%u7A0D%u5FAE%u505A%u4E86%u70B9%u6539%u52A8%uFF1A%0A%3E%u4EC0%u4E48%u662FDatabase%uFF0C%u4EC0%u4E48%u662FSchema%uFF0C%u4EC0%u4E48%u662FTable%uFF0C%u4EC0%u4E48%u662F%u5217%uFF0C%u4EC0%u4E48%u662F%u884C%uFF0C%u4EC0%u4E48%u662FUser%uFF1F%u6211%u4EEC%u53EF%u4EE5%u53EF%u4EE5%u628ADatabase%u770B%u4F5C%u662F%u4E00%u4E2A%u5927%u4ED3%u5E93%uFF0C%u4ED3%u5E93%u5206%u4E86%u5F88%u591A%u5F88%u591A%u7684%u623F%u95F4%uFF0CSchema%u5C31%u662F%u5176%u4E2D%u7684%u623F%u95F4%uFF0C%u4E00%u4E2ASchema%u4EE3%u8868%u4E00%u4E2A%u623F%u95F4%uFF0CTable%u53EF%u4EE5%u770B%u4F5C%u662F%u6BCF%u4E2ASchema%u4E2D%u7684%u67DC%u5B50%uFF0C%u884C%u548C%u5217%u5C31%u662F%u67DC%u5B50%u4E2D%u7684%u683C%u5B50%u3002User%u5C31%u662F%u623F%u95F4%u7684%u4E3B%u4EBA%u3002%0A%0AOceanBase%u8981%u6C42schema%u5F3A%u7C7B%u578B%u7EA6%u675F%uFF0C%u4E5F%u5C31%u662F%u8981%u9884%u5148%u5B9A%u4E49%u597Dschema%u3002%u8FD9%u6837%u53EF%u4EE5%u65B9%u4FBF%u7684%u8FDB%u884C%u5404%u79CDonline%20ddl%u64CD%u4F5C%u3002%0A%0AOceanBase%u7684%u8868%u548C%u5217%u4FE1%u606F%u5B58%u50A8%u5728Schema%u7684%u4E00%u4E2Ahash_map%u4E2D%u3002%u5173%u4E8ESchema%20%u4EE5%u540E%u518D%u6DF1%u5165%u4E86%u89E3%u3002%0A%0A%23%23%u56DB%u3001%u603B%u7ED3%0A%0A%u5236%u5B9A%u903B%u8F91%u8BA1%u5212%uFF0C%u6700%u5173%u952E%u7684%u662F%u8981%u7406%u89E3%u903B%u8F91%u8BA1%u5212%u7684%u8BBE%u8BA1%u76EE%u6807%uFF0C%u5176%u4E2D%u6700%u4E3B%u8981%u7684%u5185%u5BB9%u5C31%u662F%u786E%u5B9A%u903B%u8F91%u8BA1%u5212%u4E2D%u4F7F%u7528%u5230%u7684%u67E5%u8BE2Stmt%2C%u8868%uFF0C%u5217%uFF0C%u8868%u8FBE%u5F0F%uFF0C%u5E76%u4E3A%u5B83%u4EEC%u751F%u6210%u6216%u8BBE%u7F6E%u552F%u4E00%u6807%u8BC6%uFF0C%u786E%u4FDD%u5728%u540C%u4E00%u4E2A%u903B%u8F91%u8BA1%u5212%u4E2D%u662F%u4E0D%u76F8%u540C%u7684%u3002%u5236%u5B9A%u903B%u8F91%u8BA1%u5212%u7684%u51FD%u6570%u53EA%u8981%u662Freslove%u7CFB%u5217%u51FD%u6570%u3002%u800C%u8868%u548C%u5217%u7684%u4FE1%u606F%u5B58%u50A8%u5728Schema%u4E2D%u4E00%u4E2Ahash_map%u4E2D%u3002%0A%0A----%0A%0A%u6B22%u8FCE%u5149%u4E34%5B%u6211%u7684%u7F51%u7AD9%5D%28http%3A//www.cxueyou.sinaapp.com/%29----%5B%u6211%u7684%u535A%u5BA2%u56ED%5D%28http%3A//www.cnblogs.com/chenxueyou/%29----%5B%u6211%u7684CSDN%5D%28http%3A//blog.csdn.net/qq910894904/%29%u3002%0A%u5982%u679C%u9605%u8BFB%u672C%u6587%u8FC7%u7A0B%u4E2D%u6709%u4EFB%u4F55%u95EE%u9898%uFF0C%u8BF7%5B%u8054%u7CFB%u4F5C%u8005%5D%28http%3A//mail.qq.com/cgi-bin/qm_share%3Ft%3Dqm_mailme%26email%3DJx4WFx8eEx4XE2dWVglESEo%29%uFF0C%u8F6C%u8F7D%u8BF7%u6CE8%u660E%u51FA%u5904%uFF01%0A%0A