美文网首页程序员
openGauss源码#接openGuass的行update

openGauss源码#接openGuass的行update

作者: upup果 | 来源:发表于2020-12-07 08:27 被阅读0次
    • 行的update核心函数是MOTAdaptor::UpdateRow(MOTFdwStateSt* fdwState, TupleTableSlot* slot, MOT::Row* currRow)方法.今天针对这个函数及相关函数细节展开介绍

    函数的三个参数

    • MOTFdwStateSt:也就是结构体MOTFdwState_St,它的成员包括有关engine的信息,如TxnManager,table, AccessType等.还有TransactionId,CmdType,AttrNumber,m_attrsUsed,m_attrsModified等信息
    • TupleTableSlot:结构体,执行器用来保存tuple的数据结构.包括了slot的描述器,tuple的buffer等信息,每个属性值(Datum* tts_values)以及每个属性为null的flags( bool* tts_isnull).
    • currRow:当前更新的Row

    函数的执行过程

    • 通过fdwState的事务管理者(TxnManager)设置事务ID,并更新行状态(UpdateLastRowState方法)为WR
    • 通过curRow的GetData方法获取行数据(uint8_t* rowData)
    • 调用PackUpdateRow(slot, fdwState->m_table, fdwState->m_attrsModified, rowData)
      1)先定义一个tuple描述器tupdesc(slot->tts_tupleDescriptor)
      2) uint8_t* bits=数据地址+偏移量,包括空位的列数cols(table->GetFieldCount() - 1)
      3)对每个列:先BITMAP_GET(attrs_used, i), 判断i列的attrs是否为修改,没有修改则直接跳过.修改的话,获取这个列的值,然后调用col的pack方法将值memcpy到rowData.
    • 新建一个MOT::BitmapSet():modified_column(fdwState->m_attrsModified, fdwState->m_table->GetFieldCount() - 1)
    • 最后调用TxnManager的overrite方法,实际的更新重新在上面已经完成了,这里只是更新一下状态

    以上就是今天看的源码内容~
    明天针对update,设计protobuf的报文

    相关文章

      网友评论

        本文标题:openGauss源码#接openGuass的行update

        本文链接:https://www.haomeiwen.com/subject/axijwktx.html