void DeleteTranslator::InitializeQueryState() { CodeGen &codegen = GetCodeGen(); const planner::DeletePlan &plan = GetPlanAs<planner::DeletePlan>(); // Get the table pointer storage::DataTable *table = plan.GetTable(); llvm::Value *table_ptr = codegen.Call( StorageManagerProxy::GetTableWithOid, {GetStorageManagerPtr(), codegen.Const32(table->GetDatabaseOid()), codegen.Const32(table->GetOid())}); // Call Deleter.Init(txn, table) llvm::Value *deleter = LoadStatePtr(deleter_state_id_); codegen.Call(DeleterProxy::Init, {deleter, table_ptr, GetExecutorContextPtr()}); }
// Produce! void TableScanTranslator::Produce() const { auto &codegen = GetCodeGen(); auto &table = GetTable(); LOG_TRACE("TableScan on [%u] starting to produce tuples ...", table.GetOid()); // Get the table instance from the database llvm::Value *storage_manager_ptr = GetStorageManagerPtr(); llvm::Value *db_oid = codegen.Const32(table.GetDatabaseOid()); llvm::Value *table_oid = codegen.Const32(table.GetOid()); llvm::Value *table_ptr = codegen.Call(StorageManagerProxy::GetTableWithOid, {storage_manager_ptr, db_oid, table_oid}); // The selection vector for the scan auto *raw_vec = codegen.AllocateBuffer( codegen.Int32Type(), Vector::kDefaultVectorSize, "scanSelVector"); Vector sel_vec{raw_vec, Vector::kDefaultVectorSize, codegen.Int32Type()}; auto predicate = const_cast<expression::AbstractExpression *>( GetScanPlan().GetPredicate()); llvm::Value *predicate_ptr = codegen->CreateIntToPtr( codegen.Const64((int64_t)predicate), AbstractExpressionProxy::GetType(codegen)->getPointerTo()); size_t num_preds = 0; auto *zone_map_manager = storage::ZoneMapManager::GetInstance(); if (predicate != nullptr && zone_map_manager->ZoneMapTableExists()) { if (predicate->IsZoneMappable()) { num_preds = predicate->GetNumberofParsedPredicates(); } } ScanConsumer scan_consumer{*this, sel_vec}; table_.GenerateScan(codegen, table_ptr, sel_vec.GetCapacity(), scan_consumer, predicate_ptr, num_preds); LOG_TRACE("TableScan on [%u] finished producing tuples ...", table.GetOid()); }