@@ -78,14 +78,14 @@ TEST_F(LogBufferTests, InsertLogBufferTest) {
7878 values.push_back (val3);
7979 insert_record.SetValuesArray (reinterpret_cast <char *>(values.data ()), static_cast <uint32_t >(values.size ()));
8080 log_buffer->WriteRecord (insert_record);
81- size_t buffer_size1 = sizeof (int32_t ) + sizeof (int8_t ) + sizeof (int64_t ) * 3 + sizeof (int64_t ) * 4 +
81+ size_t buffer_size = sizeof (int32_t ) + sizeof (int8_t ) + sizeof (int64_t ) * 3 + sizeof (int64_t ) * 4 +
8282 sizeof (double ) * 3 ;
83- EXPECT_EQ (buffer_size1 , log_buffer->GetSize ());
83+ EXPECT_EQ (buffer_size , log_buffer->GetSize ());
8484
8585 ReferenceSerializeInput log_buffer_input (log_buffer->GetData (), log_buffer->GetSize ());
8686
8787 // Insert record
88- EXPECT_EQ (buffer_size1 - sizeof (int32_t ), log_buffer_input.ReadInt ());
88+ EXPECT_EQ (buffer_size - sizeof (int32_t ), log_buffer_input.ReadInt ());
8989 EXPECT_EQ (static_cast <int >(LogRecordType::TUPLE_INSERT), log_buffer_input.ReadEnumInSingleByte ());
9090 EXPECT_EQ (txn_id, log_buffer_input.ReadLong ());
9191 EXPECT_EQ (epoch_id, log_buffer_input.ReadLong ());
@@ -99,6 +99,101 @@ TEST_F(LogBufferTests, InsertLogBufferTest) {
9999 EXPECT_EQ (value3, log_buffer_input.ReadDouble ());
100100}
101101
102+ TEST_F (LogBufferTests, UpdateLogBufferTest) {
103+ oid_t block = 1 , offset = 16 , new_block = 1 , new_offset = 24 ;
104+ ItemPointer location (block, offset);
105+ ItemPointer new_location (new_block, new_offset);
106+ eid_t epoch_id = 3 ;
107+ txn_id_t txn_id = 99 ;
108+ cid_t commit_id = 98 ;
109+ oid_t database_id = 10 ;
110+ oid_t table_id = 20 ;
111+ oid_t tile_group_id = 30 ;
112+ double value1 = 9.1 , value2 = 9.2 , value3 = 9.3 ;
113+ oid_t target_oid1 = 2 , target_oid2 = 4 , target_oid3 = 5 ;
114+
115+ logging::LogBuffer *log_buffer;
116+ log_buffer = new logging::LogBuffer (logging::LogManager::GetInstance ().GetTransactionBufferSize ());
117+
118+ // TILES
119+ std::vector<std::string> tile_column_names;
120+ std::vector<std::vector<std::string>> column_names;
121+
122+ tile_column_names.push_back (" INTEGER COL" );
123+ column_names.push_back (tile_column_names);
124+
125+ std::vector<catalog::Schema> schemas;
126+ std::vector<catalog::Column> columns;
127+
128+ // SCHEMA
129+ catalog::Column column1 (type::TypeId::INTEGER, type::Type::GetTypeSize (type::TypeId::INTEGER),
130+ " A" , true );
131+ columns.push_back (column1);
132+
133+ std::unique_ptr<catalog::Schema> schema1 (new catalog::Schema (columns));
134+ schemas.push_back (*schema1);
135+
136+ std::map<oid_t , std::pair<oid_t , oid_t >> column_map;
137+ column_map[0 ] = std::make_pair (0 , 0 );
138+
139+ std::shared_ptr<storage::TileGroup> tile_group (storage::TileGroupFactory::GetTileGroup (
140+ database_id, table_id, tile_group_id, nullptr , schemas, column_map, 3 ));
141+ catalog::Manager::GetInstance ().AddTileGroup (block, tile_group);
142+
143+ logging::LogRecord insert_record = logging::LogRecordFactory::CreateTupleRecord (
144+ LogRecordType::TUPLE_INSERT, location, epoch_id, txn_id, commit_id);
145+ logging::LogRecord update_record = logging::LogRecordFactory::CreateTupleRecord (
146+ LogRecordType::TUPLE_UPDATE, location, new_location, epoch_id, txn_id,
147+ commit_id);
148+
149+ EXPECT_EQ (log_buffer->GetThreshold (), logging::LogManager::GetInstance ().GetTransactionBufferSize ());
150+
151+ type::Value val1 = type::ValueFactory::GetDecimalValue (value1);
152+ type::Value val2 = type::ValueFactory::GetDecimalValue (value2);
153+ type::Value val3 = type::ValueFactory::GetDecimalValue (value3);
154+ std::vector<type::Value> values;
155+ values.push_back (val1);
156+ values.push_back (val2);
157+ values.push_back (val3);
158+ expression::AbstractExpression *expr = nullptr ;
159+ planner::DerivedAttribute tmp_att (expr);
160+ Target target1 = std::make_pair (target_oid1, tmp_att);
161+ Target target2 = std::make_pair (target_oid2, tmp_att);
162+ Target target3 = std::make_pair (target_oid3, tmp_att);
163+ TargetList *target_list = new TargetList;
164+ target_list->push_back (target1);
165+ target_list->push_back (target2);
166+ target_list->push_back (target3);
167+ update_record.SetOffsetsArray (target_list);
168+ update_record.SetValuesArray (reinterpret_cast <char *>(values.data ()), static_cast <uint32_t >(values.size ()));
169+ log_buffer->WriteRecord (update_record);
170+ size_t buffer_size = sizeof (int32_t ) + sizeof (int8_t ) + sizeof (int64_t ) * 3 + sizeof (int64_t ) * 7 +
171+ (sizeof (int32_t ) + sizeof (double )) * 3 ;
172+ EXPECT_EQ (buffer_size, log_buffer->GetSize ());
173+
174+ ReferenceSerializeInput log_buffer_input (log_buffer->GetData (), log_buffer->GetSize ());
175+
176+ // Update Record
177+ EXPECT_EQ (buffer_size - sizeof (int32_t ), log_buffer_input.ReadInt ());
178+ EXPECT_EQ (static_cast <int >(LogRecordType::TUPLE_UPDATE), log_buffer_input.ReadEnumInSingleByte ());
179+ EXPECT_EQ (txn_id, log_buffer_input.ReadLong ());
180+ EXPECT_EQ (epoch_id, log_buffer_input.ReadLong ());
181+ EXPECT_EQ (commit_id, log_buffer_input.ReadLong ());
182+ EXPECT_EQ (database_id, log_buffer_input.ReadLong ());
183+ EXPECT_EQ (table_id, log_buffer_input.ReadLong ());
184+ EXPECT_EQ (block, log_buffer_input.ReadLong ());
185+ EXPECT_EQ (offset, log_buffer_input.ReadLong ());
186+ EXPECT_EQ (new_block, log_buffer_input.ReadLong ());
187+ EXPECT_EQ (new_offset, log_buffer_input.ReadLong ());
188+ EXPECT_EQ (update_record.GetNumValues (), log_buffer_input.ReadLong ());
189+ EXPECT_EQ (target_oid1, log_buffer_input.ReadInt ());
190+ EXPECT_EQ (value1, log_buffer_input.ReadDouble ());
191+ EXPECT_EQ (target_oid2, log_buffer_input.ReadInt ());
192+ EXPECT_EQ (value2, log_buffer_input.ReadDouble ());
193+ EXPECT_EQ (target_oid3, log_buffer_input.ReadInt ());
194+ EXPECT_EQ (value3, log_buffer_input.ReadDouble ());
195+ }
196+
102197TEST_F (LogBufferTests, LogBufferTest) {
103198 oid_t block = 1 , offset = 16 , old_block = 1 , old_offset = 8 , new_block = 1 ,
104199 new_offset = 24 ;
0 commit comments