@@ -169,22 +169,22 @@ void Catalog::BootstrapSystemCatalogs(storage::Database *database,
169169 // pg_database record is shared across different databases
170170 system_catalogs->GetTableCatalog ()->InsertTable (
171171 DATABASE_CATALOG_OID, DATABASE_CATALOG_NAME, CATALOG_SCHEMA_NAME,
172- CATALOG_DATABASE_OID, pool_.get (), txn);
172+ CATALOG_DATABASE_OID, ROW_STORE_LAYOUT_OID, pool_.get (), txn);
173173 system_catalogs->GetTableCatalog ()->InsertTable (
174174 SCHEMA_CATALOG_OID, SCHEMA_CATALOG_NAME, CATALOG_SCHEMA_NAME,
175- database_oid, pool_.get (), txn);
175+ database_oid, ROW_STORE_LAYOUT_OID, pool_.get (), txn);
176176 system_catalogs->GetTableCatalog ()->InsertTable (
177177 TABLE_CATALOG_OID, TABLE_CATALOG_NAME, CATALOG_SCHEMA_NAME, database_oid,
178- pool_.get (), txn);
178+ ROW_STORE_LAYOUT_OID, pool_.get (), txn);
179179 system_catalogs->GetTableCatalog ()->InsertTable (
180180 INDEX_CATALOG_OID, INDEX_CATALOG_NAME, CATALOG_SCHEMA_NAME, database_oid,
181- pool_.get (), txn);
181+ ROW_STORE_LAYOUT_OID, pool_.get (), txn);
182182 system_catalogs->GetTableCatalog ()->InsertTable (
183183 COLUMN_CATALOG_OID, COLUMN_CATALOG_NAME, CATALOG_SCHEMA_NAME,
184- database_oid, pool_.get (), txn);
184+ database_oid, ROW_STORE_LAYOUT_OID, pool_.get (), txn);
185185 system_catalogs->GetTableCatalog ()->InsertTable (
186186 LAYOUT_CATALOG_OID, LAYOUT_CATALOG_NAME, CATALOG_SCHEMA_NAME,
187- database_oid, pool_.get (), txn);
187+ database_oid, ROW_STORE_LAYOUT_OID, pool_.get (), txn);
188188}
189189
190190void Catalog::Bootstrap () {
@@ -208,6 +208,12 @@ void Catalog::Bootstrap() {
208208
209209 InitializeLanguages ();
210210 InitializeFunctions ();
211+
212+ // Reset oid of each catalog to avoid collisions between catalog
213+ // values added by system and users when checkpoint recovery.
214+ DatabaseCatalog::GetInstance ()->UpdateOid (OID_FOR_USER_OFFSET);
215+ LanguageCatalog::GetInstance ().UpdateOid (OID_FOR_USER_OFFSET);
216+ ProcCatalog::GetInstance ().UpdateOid (OID_FOR_USER_OFFSET);
211217}
212218
213219// ===----------------------------------------------------------------------===//
@@ -362,13 +368,14 @@ ResultType Catalog::CreateTable(const std::string &database_name,
362368
363369 // Update pg_table with table info
364370 pg_table->InsertTable (table_oid, table_name, schema_name,
365- database_object->GetDatabaseOid (), pool_.get (), txn);
371+ database_object->GetDatabaseOid (),
372+ table->GetDefaultLayout ()->GetOid (), pool_.get (), txn);
366373 oid_t column_id = 0 ;
367374 for (const auto &column : table->GetSchema ()->GetColumns ()) {
368375 pg_attribute->InsertColumn (table_oid, column.GetName (), column_id,
369376 column.GetOffset (), column.GetType (),
370- column.IsInlined (), column.GetConstraints (),
371- pool_.get (), txn);
377+ column.GetLength (), column.IsInlined (),
378+ column. GetConstraints (), pool_.get (), txn);
372379
373380 // Create index on unique single column
374381 if (column.IsUnique ()) {
@@ -383,6 +390,15 @@ ResultType Catalog::CreateTable(const std::string &database_name,
383390 }
384391 CreatePrimaryIndex (database_object->GetDatabaseOid (), table_oid, schema_name,
385392 txn);
393+
394+ // Create layout as default layout
395+ auto pg_layout =
396+ catalog_map_[database_object->GetDatabaseOid ()]->GetLayoutCatalog ();
397+ auto default_layout = table->GetDefaultLayout ();
398+ if (!pg_layout->InsertLayout (table_oid, default_layout, pool_.get (), txn))
399+ throw CatalogException (" Failed to create a new layout for table "
400+ + table_name);
401+
386402 return ResultType::SUCCESS;
387403}
388404
@@ -573,15 +589,15 @@ std::shared_ptr<const storage::Layout> Catalog::CreateLayout(
573589 // Ensure that the new layout
574590 PELOTON_ASSERT (layout_oid < INVALID_OID);
575591 auto new_layout = std::shared_ptr<const storage::Layout>(
576- new const storage::Layout (column_map, layout_oid));
592+ new const storage::Layout (column_map, column_map. size (), layout_oid));
577593
578594 // Add the layout the pg_layout table
579595 auto pg_layout = catalog_map_[database_oid]->GetLayoutCatalog ();
580- bool result =
581- pg_layout-> InsertLayout (table_oid, new_layout, pool_. get (), txn);
582- if (!result ) {
583- LOG_ERROR (" Failed to create a new layout for table %u" , table_oid);
584- return nullptr ;
596+ if (pg_layout-> GetLayoutWithOid (table_oid, new_layout-> GetOid (), txn)
597+ == nullptr &&
598+ !pg_layout-> InsertLayout (table_oid, new_layout, pool_. get (), txn) ) {
599+ LOG_ERROR (" Failed to create a new layout for table %u" , table_oid);
600+ return nullptr ;
585601 }
586602 return new_layout;
587603}
@@ -596,6 +612,10 @@ std::shared_ptr<const storage::Layout> Catalog::CreateDefaultLayout(
596612 auto database = storage_manager->GetDatabaseWithOid (database_oid);
597613 auto table = database->GetTableWithOid (table_oid);
598614 table->SetDefaultLayout (new_layout);
615+
616+ // update table catalog
617+ catalog_map_[database_oid]->GetTableCatalog ()
618+ ->UpdateDefaultLayoutOid (new_layout->GetOid (), table_oid, txn);
599619 }
600620 return new_layout;
601621}
@@ -791,7 +811,7 @@ ResultType Catalog::DropIndex(oid_t database_oid, oid_t index_oid,
791811 // find index catalog object by looking up pg_index or read from cache using
792812 // index_oid
793813 auto pg_index = catalog_map_[database_oid]->GetIndexCatalog ();
794- auto index_object = pg_index->GetIndexObject (index_oid, txn);
814+ auto index_object = pg_index->GetIndexObject (database_oid, index_oid, txn);
795815 if (index_object == nullptr ) {
796816 throw CatalogException (" Can't find index " + std::to_string (index_oid) +
797817 " to drop" );
@@ -801,7 +821,7 @@ ResultType Catalog::DropIndex(oid_t database_oid, oid_t index_oid,
801821 auto table = storage_manager->GetTableWithOid (database_oid,
802822 index_object->GetTableOid ());
803823 // drop record in pg_index
804- pg_index->DeleteIndex (index_oid, txn);
824+ pg_index->DeleteIndex (database_oid, index_oid, txn);
805825 LOG_TRACE (" Successfully drop index %d for table %s" , index_oid,
806826 table->GetName ().c_str ());
807827
@@ -822,17 +842,29 @@ ResultType Catalog::DropLayout(oid_t database_oid, oid_t table_oid,
822842 auto table = database->GetTableWithOid (table_oid);
823843 auto default_layout = table->GetDefaultLayout ();
824844
825- if (default_layout.GetOid () == layout_oid) {
826- table->ResetDefaultLayout ();
827- }
828-
829845 auto pg_layout = catalog_map_[database_oid]->GetLayoutCatalog ();
830846 if (!pg_layout->DeleteLayout (table_oid, layout_oid, txn)) {
831847 auto layout = table->GetDefaultLayout ();
832- LOG_DEBUG (" Layout delete failed. Default layout id: %u" , layout. GetOid ());
848+ LOG_DEBUG (" Layout delete failed. Default layout id: %u" , layout-> GetOid ());
833849 return ResultType::FAILURE;
834850 }
835851
852+ if (default_layout->GetOid () == layout_oid) {
853+ table->ResetDefaultLayout ();
854+ auto new_default_layout = table->GetDefaultLayout ();
855+ if (pg_layout->GetLayoutWithOid (table_oid, new_default_layout->GetOid (),
856+ txn) == nullptr &&
857+ !pg_layout->InsertLayout (table_oid, new_default_layout,
858+ pool_.get (), txn)) {
859+ LOG_DEBUG (" Failed to create a new layout for table %d" , table_oid);
860+ return ResultType::FAILURE;
861+ }
862+
863+ // update table catalog
864+ catalog_map_[database_oid]->GetTableCatalog ()
865+ ->UpdateDefaultLayoutOid (new_default_layout->GetOid (), table_oid, txn);
866+ }
867+
836868 return ResultType::SUCCESS;
837869}
838870
0 commit comments