Untitled
unknown
c_cpp
2 years ago
3.1 kB
6
Indexable
//===----------------------------------------------------------------------===// // // BusTub // // insert_executor.cpp // // Identification: src/execution/insert_executor.cpp // // Copyright (c) 2015-2021, Carnegie Mellon University Database Group // //===----------------------------------------------------------------------===// // #include <_types/_uint32_t.h> // #include <_types/_uint64_t.h> #include "execution/executors/insert_executor.h" #include <memory> #include "concurrency/transaction_manager.h" namespace bustub { InsertExecutor::InsertExecutor(ExecutorContext *exec_ctx, const InsertPlanNode *plan, std::unique_ptr<AbstractExecutor> &&child_executor) : AbstractExecutor(exec_ctx) { child_executor_ = std::move(child_executor); plan_ = plan; table_info_ = exec_ctx_->GetCatalog()->GetTable(plan_->GetTableOid()); first_call_ = false; } void InsertExecutor::Init() { child_executor_->Init(); first_call_ = true; } auto InsertExecutor::Next([[maybe_unused]] Tuple *tuple, RID *rid) -> bool { if (!first_call_) { return false; } first_call_ = false; Tuple c_tuple; RID c_rid; TupleMeta tuplemeta; tuplemeta.is_deleted_ = false; // tuplemeta.ts_ = 0; // TODO(chien-yu-liu): update timestamp tuplemeta.ts_ = exec_ctx_->GetTransaction()->GetTransactionTempTs(); // RID final_rid; int32_t count = 0; std::vector<IndexInfo *> index_infos = exec_ctx_->GetCatalog()->GetTableIndexes(table_info_->name_); while (child_executor_->Next(&c_tuple, &c_rid)) { auto insert_rid = table_info_->table_->InsertTuple(tuplemeta, c_tuple, exec_ctx_->GetLockManager(), exec_ctx_->GetTransaction(), plan_->GetTableOid()); count++; for (auto &index_info : index_infos) { auto metadata = index_info->index_->GetMetadata(); auto key_attr = metadata->GetKeyAttrs(); auto key_schema = index_info->index_->GetKeySchema(); auto key = c_tuple.KeyFromTuple(table_info_->schema_, *key_schema, key_attr); index_info->index_->InsertEntry(key, insert_rid.value(), exec_ctx_->GetTransaction()); } // final_rid = insert_rid.value(); exec_ctx_->GetTransaction()->AppendWriteSet(plan_->table_oid_, insert_rid.value()); // break; } Value v(INTEGER, count); Tuple new_tuple({v}, &plan_->OutputSchema()); *tuple = new_tuple; // added ????? // auto transaction_id = exec_ctx_->GetTransaction()->GetTransactionId(); // std::cout << "insert's transaction_id = " << transaction_id << std::endl; // exec_ctx_->GetTransaction()->AppendWriteSet(plan_->table_oid_, final_rid); // add??? // std::cout << "AppendWriteSet called for " << plan_->table_oid_ << ", inserted_rid = " << final_rid << std::endl; // table_info_->table_->UpdateTupleInPlace(tuplemeta, new_tuple, final_rid, nullptr); // exec_ctx_->GetTransactionManager()->UpdateUndoLink(final_rid, std::nullopt, nullptr); return true; } } // namespace bustub
Editor is loading...
Leave a Comment