blob: f2d12f25c6d0721e857ff577ac340c2fc2867206 [file]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "paimon/catalog/table.h"
#include "arrow/api.h"
#include "gtest/gtest.h"
#include "paimon/core/schema/schema_manager.h"
#include "paimon/core/schema/table_schema.h"
#include "paimon/schema/schema.h"
#include "paimon/testing/utils/testharness.h"
namespace paimon::test {
TEST(TableTest, TestCreateWithUnknownDatabase) {
auto dir = UniqueTestDirectory::Create();
ASSERT_TRUE(dir);
SchemaManager schema_manager(dir->GetFileSystem(), dir->Str());
auto schema =
arrow::schema({arrow::field("id", arrow::int32(), /*nullable=*/false),
arrow::field("name", arrow::utf8()), arrow::field("value", arrow::int64())});
std::vector<std::string> partition_keys = {"name"};
std::vector<std::string> primary_keys = {"id"};
std::map<std::string, std::string> options = {
{"file.format", "orc"},
{"commit.force-compact", "true"},
};
ASSERT_OK_AND_ASSIGN([[maybe_unused]] std::unique_ptr<TableSchema> created_schema,
schema_manager.CreateTable(schema, partition_keys, primary_keys, options));
ASSERT_OK_AND_ASSIGN(std::shared_ptr<Table> table,
Table::Create(dir->GetFileSystem(), dir->Str(), Identifier("tbl1")));
EXPECT_EQ(table->Name(), "tbl1");
EXPECT_EQ(table->FullName(), "tbl1");
std::shared_ptr<Schema> latest_schema = table->LatestSchema();
ASSERT_NE(latest_schema, nullptr);
auto data_schema = std::dynamic_pointer_cast<DataSchema>(latest_schema);
ASSERT_TRUE(data_schema != nullptr);
ASSERT_TRUE(std::dynamic_pointer_cast<TableSchema>(latest_schema) != nullptr);
EXPECT_EQ(data_schema->Id(), 0);
EXPECT_EQ(data_schema->PartitionKeys(), partition_keys);
EXPECT_EQ(data_schema->PrimaryKeys(), primary_keys);
}
TEST(TableTest, TestCreateFailedWithNonExistSchema) {
auto dir = UniqueTestDirectory::Create();
ASSERT_TRUE(dir);
auto fs = dir->GetFileSystem();
SchemaManager schema_manager(fs, dir->Str());
auto schema =
arrow::schema({arrow::field("id", arrow::int32(), /*nullable=*/false),
arrow::field("name", arrow::utf8()), arrow::field("value", arrow::int64())});
std::vector<std::string> partition_keys = {"name"};
std::vector<std::string> primary_keys = {"id"};
std::map<std::string, std::string> options = {
{"file.format", "orc"},
{"commit.force-compact", "true"},
};
ASSERT_OK_AND_ASSIGN([[maybe_unused]] std::unique_ptr<TableSchema> created_schema,
schema_manager.CreateTable(schema, partition_keys, primary_keys, options));
// remove schema
std::string schema_path = schema_manager.ToSchemaPath(0);
ASSERT_OK(fs->Delete(schema_path, /*recursive=*/false));
// check create table failed
ASSERT_NOK_WITH_MSG(
Table::Create(fs, dir->Str(), Identifier("tbl1")),
"load table schema for Identifier{database='unknown', table='tbl1'} failed");
}
} // namespace paimon::test