diff --git a/src/catalog/catalog.cpp b/src/catalog/catalog.cpp index 24a9760b7a8..9b2b0c01692 100644 --- a/src/catalog/catalog.cpp +++ b/src/catalog/catalog.cpp @@ -84,6 +84,8 @@ Catalog::Catalog() : pool_(new type::EphemeralPool()) { void Catalog::BootstrapSystemCatalogs(storage::Database *database, concurrency::TransactionContext *txn) { oid_t database_oid = database->GetOid(); + LOG_INFO("database_oid = %d", database_oid); + LOG_INFO("database name = %s", database->GetDBName().c_str()); catalog_map_.emplace(database_oid, std::shared_ptr( new SystemCatalogs(database, pool_.get(), txn))); @@ -157,6 +159,7 @@ void Catalog::BootstrapSystemCatalogs(storage::Database *database, CATALOG_SCHEMA_NAME, IndexType::BWTREE, IndexConstraintType::DEFAULT, false, {TableCatalog::ColumnId::DATABASE_OID}, pool_.get(), txn); + // Insert records(default + pg_catalog namespace) into pg_namespace system_catalogs->GetSchemaCatalog()->InsertSchema( CATALOG_SCHEMA_OID, CATALOG_SCHEMA_NAME, pool_.get(), txn); @@ -226,7 +229,7 @@ ResultType Catalog::CreateDatabase(const std::string &database_name, oid_t database_oid = pg_database->GetNextOid(); storage::Database *database = new storage::Database(database_oid); - + LOG_INFO("get database"); // TODO: This should be deprecated, dbname should only exists in pg_db database->setDBName(database_name); { @@ -239,13 +242,55 @@ ResultType Catalog::CreateDatabase(const std::string &database_name, pg_database->InsertDatabase(database_oid, database_name, pool_.get(), txn); // add core & non-core system catalog tables into database + LOG_INFO("begin bootstrap %s", database_name.c_str()); BootstrapSystemCatalogs(database, txn); + LOG_INFO("end bootstrap %s", database_name.c_str()); catalog_map_[database_oid]->Bootstrap(database_name, txn); LOG_TRACE("Database %s created. Returning RESULT_SUCCESS.", database_name.c_str()); return ResultType::SUCCESS; } + +ResultType Catalog::CreateDatabaseWithoutIndex(const std::string &database_name, + concurrency::TransactionContext *txn) { + if (txn == nullptr) + throw CatalogException("Do not have transaction to create database " + + database_name); + + auto pg_database = DatabaseCatalog::GetInstance(); + auto storage_manager = storage::StorageManager::GetInstance(); + // Check if a database with the same name exists + auto database_object = pg_database->GetDatabaseObject(database_name, txn); + if (database_object != nullptr) + throw CatalogException("Database " + database_name + " already exists"); + + // Create actual database + oid_t database_oid = pg_database->GetNextOid(); + + storage::Database *database = new storage::Database(database_oid); + LOG_INFO("get database"); + // TODO: This should be deprecated, dbname should only exists in pg_db + database->setDBName(database_name); + { + std::lock_guard lock(catalog_mutex); + storage_manager->AddDatabaseToStorageManager(database); + } + // put database object into rw_object_set + txn->RecordCreate(database_oid, INVALID_OID, INVALID_OID); + // Insert database record into pg_db + pg_database->InsertDatabase(database_oid, database_name, pool_.get(), txn); + + // add core & non-core system catalog tables into database + LOG_INFO("begin bootstrap %s", database_name.c_str()); + BootstrapSystemCatalogs(database, txn); + LOG_INFO("end bootstrap %s", database_name.c_str()); +// catalog_map_[database_oid]->Bootstrap(database_name, txn); + LOG_TRACE("Database %s created. Returning RESULT_SUCCESS.", + database_name.c_str()); + return ResultType::SUCCESS; +} + /*@brief create schema(namespace) * @param database_name the database which the namespace belongs to * @param schema_name name of the schema diff --git a/src/catalog/system_catalogs.cpp b/src/catalog/system_catalogs.cpp index b1371ddd379..463d9041903 100644 --- a/src/catalog/system_catalogs.cpp +++ b/src/catalog/system_catalogs.cpp @@ -80,11 +80,13 @@ SystemCatalogs::~SystemCatalogs() { * @param txn TransactionContext */ void SystemCatalogs::Bootstrap(const std::string &database_name, - concurrency::TransactionContext *txn) { + UNUSED_ATTRIBUTE concurrency::TransactionContext *txn) { LOG_DEBUG("Bootstrapping database: %s", database_name.c_str()); if (!pg_trigger_) { + LOG_INFO("TriggerCatalog begin"); pg_trigger_ = new TriggerCatalog(database_name, txn); + LOG_INFO("TriggerCatalog end"); } // if (!pg_proc) { diff --git a/src/include/catalog/catalog.h b/src/include/catalog/catalog.h index 82cd1df84da..058a11a9ef8 100644 --- a/src/include/catalog/catalog.h +++ b/src/include/catalog/catalog.h @@ -89,6 +89,9 @@ class Catalog { ResultType CreateDatabase(const std::string &database_name, concurrency::TransactionContext *txn); + ResultType CreateDatabaseWithoutIndex(const std::string &database_name, + concurrency::TransactionContext *txn); + // Create a schema(namespace) ResultType CreateSchema(const std::string &database_name, const std::string &schema_name, @@ -118,6 +121,7 @@ class Catalog { concurrency::TransactionContext *txn, bool is_catalog = false); + //===--------------------------------------------------------------------===// // DROP FUNCTIONS //===--------------------------------------------------------------------===// diff --git a/test/concurrency/testing_transaction_util.cpp b/test/concurrency/testing_transaction_util.cpp index 80bbb6e4955..ccd7523e4a5 100644 --- a/test/concurrency/testing_transaction_util.cpp +++ b/test/concurrency/testing_transaction_util.cpp @@ -217,7 +217,7 @@ storage::DataTable *TestingTransactionUtil::CreateTable( storage::DataTable *TestingTransactionUtil::CreateTableWithoutIndex( std::string database_name, std::string schema_name, std::string table_name) { LOG_INFO("database name = %s", database_name.c_str()); - LOG_INFO("table name = %s", table_name.c_str()); + auto id_column = catalog::Column( type::TypeId::INTEGER, type::Type::GetTypeSize(type::TypeId::INTEGER), "id", true); @@ -228,14 +228,21 @@ storage::DataTable *TestingTransactionUtil::CreateTableWithoutIndex( std::unique_ptr table_schema( new catalog::Schema({id_column, value_column})); + LOG_INFO("schema name = %s", schema_name.c_str()); auto catalog = catalog::Catalog::GetInstance(); // Create Database and Table auto &txn_manager = concurrency::TransactionManagerFactory::GetInstance(); auto txn = txn_manager.BeginTransaction(); - catalog->CreateDatabase(database_name, txn); + LOG_INFO("table name = %s", table_name.c_str()); + catalog->CreateDatabaseWithoutIndex(database_name, txn); txn_manager.CommitTransaction(txn); LOG_INFO("create database %s", database_name.c_str()); + txn = txn_manager.BeginTransaction(); + catalog->CreateSchema(database_name, schema_name, txn); + txn_manager.CommitTransaction(txn); + LOG_INFO("create schema %s", schema_name.c_str()); + txn = txn_manager.BeginTransaction(); catalog->CreateTable(database_name, schema_name, table_name, std::move(table_schema), txn); txn_manager.CommitTransaction(txn);