in-memory parts: fix 'check' query

This commit is contained in:
Anton Popov 2020-06-03 21:59:18 +03:00
parent 1ce09e1faa
commit 11c4e9dde3
9 changed files with 28 additions and 14 deletions

View File

@ -289,7 +289,7 @@ MergeTreeData::MutableDataPartPtr Fetcher::downloadPartToMemory(
throw Exception("Cannot deserialize checksums", ErrorCodes::CORRUPTED_DATA);
NativeBlockInputStream block_in(in, 0);
auto block = block_in.read();
auto block = block_in.read();
auto volume = std::make_shared<SingleDiskVolume>("volume_" + part_name, reservation->getDisk());
MergeTreeData::MutableDataPartPtr new_data_part =

View File

@ -889,6 +889,11 @@ void IMergeTreeDataPart::checkConsistencyBase() const
}
}
void IMergeTreeDataPart::checkConsistency(bool /* require_part_metadata */) const
{
throw Exception("Method 'checkConsistency' is not implemented for part with type " + getType().toString(), ErrorCodes::NOT_IMPLEMENTED);
}
void IMergeTreeDataPart::calculateColumnsSizesOnDisk()
{

View File

@ -332,7 +332,7 @@ protected:
void removeIfNeeded();
virtual void checkConsistency(bool require_part_metadata) const = 0;
virtual void checkConsistency(bool require_part_metadata) const;
void checkConsistencyBase() const;
/// Fill each_columns_size and total_size with sizes from columns files on

View File

@ -108,14 +108,14 @@ void MergeTreeDataPartInMemory::notifyMerged() const
is_merged.notify_one();
}
void MergeTreeDataPartInMemory::renameTo(const String & new_relative_path, bool /* remove_new_dir_if_exists */) const
{
relative_path = new_relative_path;
}
void MergeTreeDataPartInMemory::calculateEachColumnSizesOnDisk(ColumnSizeByName & /*each_columns_size*/, ColumnSize & /*total_size*/) const
{
// throw Exception("calculateEachColumnSizesOnDisk of in memory part", ErrorCodes::NOT_IMPLEMENTED);
}
void MergeTreeDataPartInMemory::loadIndexGranularity()
{
throw Exception("loadIndexGranularity of in memory part", ErrorCodes::NOT_IMPLEMENTED);
}
}

View File

@ -40,7 +40,7 @@ public:
bool isStoredOnDisk() const override { return false; }
bool hasColumnFiles(const String & column_name, const IDataType & /* type */) const override { return !!getColumnPosition(column_name); }
String getFileNameForColumn(const NameAndTypePair & /* column */) const override { return ""; }
void renameTo(const String & /*new_relative_path*/, bool /*remove_new_dir_if_exists*/) const override {}
void renameTo(const String & new_relative_path, bool remove_new_dir_if_exists) const override;
void makeCloneInDetached(const String & prefix) const override;
void flushToDisk(const String & base_path, const String & new_relative_path) const;
@ -53,11 +53,6 @@ public:
private:
mutable std::condition_variable is_merged;
void checkConsistency(bool /* require_part_metadata */) const override {}
/// Loads marks index granularity into memory
void loadIndexGranularity() override;
/// Compact parts doesn't support per column size, only total size
void calculateEachColumnSizesOnDisk(ColumnSizeByName & each_columns_size, ColumnSize & total_size) const override;
};

View File

@ -166,6 +166,9 @@ IMergeTreeDataPart::Checksums checkDataPart(
bool require_checksums,
std::function<bool()> is_cancelled)
{
if (!data_part->isStoredOnDisk())
return data_part->checksums;
return checkDataPart(
data_part->volume->getDisk(),
data_part->getFullRelativePath(),

View File

@ -1315,7 +1315,7 @@ CheckResults StorageMergeTree::checkData(const ASTPtr & query, const Context & c
/// If the checksums file is not present, calculate the checksums and write them to disk.
String checksums_path = part_path + "checksums.txt";
String tmp_checksums_path = part_path + "checksums.txt.tmp";
if (!disk->exists(checksums_path))
if (part->isStoredOnDisk() && !disk->exists(checksums_path))
{
try
{

View File

@ -0,0 +1 @@
201901_1_1_0 1

View File

@ -0,0 +1,10 @@
-- Part of 00961_check_table test, but with in-memory parts
SET check_query_single_value_result = 0;
DROP TABLE IF EXISTS mt_table;
CREATE TABLE mt_table (d Date, key UInt64, data String) ENGINE = MergeTree() PARTITION BY toYYYYMM(d) ORDER BY key
SETTINGS min_rows_for_compact_part = 1000, min_rows_for_compact_part = 1000;
CHECK TABLE mt_table;
INSERT INTO mt_table VALUES (toDate('2019-01-02'), 1, 'Hello'), (toDate('2019-01-02'), 2, 'World');
CHECK TABLE mt_table;
DROP TABLE mt_table;