mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-22 07:31:57 +00:00
Merge pull request #57520 from Avogar/ignore-mv-with-dropped-target-table
Ignore MVs with dropped target table during pushing to views
This commit is contained in:
commit
7e6e835e2e
@ -585,6 +585,7 @@ class IColumn;
|
||||
M(Bool, enable_early_constant_folding, true, "Enable query optimization where we analyze function and subqueries results and rewrite query if there're constants there", 0) \
|
||||
M(Bool, deduplicate_blocks_in_dependent_materialized_views, false, "Should deduplicate blocks for materialized views if the block is not a duplicate for the table. Use true to always deduplicate in dependent tables.", 0) \
|
||||
M(Bool, materialized_views_ignore_errors, false, "Allows to ignore errors for MATERIALIZED VIEW, and deliver original block to the table regardless of MVs", 0) \
|
||||
M(Bool, ignore_materialized_views_with_dropped_target_table, false, "Ignore MVs with dropped taraget table during pushing to views", 0) \
|
||||
M(Bool, allow_experimental_refreshable_materialized_view, false, "Allow refreshable materialized views (CREATE MATERIALIZED VIEW <name> REFRESH ...).", 0) \
|
||||
M(Bool, stop_refreshable_materialized_views_on_startup, false, "On server startup, prevent scheduling of refreshable materialized views, as if with SYSTEM STOP VIEWS. You can manually start them with SYSTEM START VIEWS or SYSTEM START VIEW <name> afterwards. Also applies to newly created views. Has no effect on non-refreshable materialized views.", 0) \
|
||||
M(Bool, use_compact_format_in_distributed_parts_names, true, "Changes format of directories names for distributed table insert parts.", 0) \
|
||||
|
@ -39,6 +39,7 @@ namespace DB
|
||||
namespace ErrorCodes
|
||||
{
|
||||
extern const int LOGICAL_ERROR;
|
||||
extern const int UNKNOWN_TABLE;
|
||||
}
|
||||
|
||||
ThreadStatusesHolder::~ThreadStatusesHolder()
|
||||
@ -316,7 +317,21 @@ Chain buildPushingToViewsChain(
|
||||
type = QueryViewsLogElement::ViewType::MATERIALIZED;
|
||||
result_chain.addTableLock(lock);
|
||||
|
||||
StoragePtr inner_table = materialized_view->getTargetTable();
|
||||
StoragePtr inner_table = materialized_view->tryGetTargetTable();
|
||||
/// If target table was dropped, ignore this materialized view.
|
||||
if (!inner_table)
|
||||
{
|
||||
if (context->getSettingsRef().ignore_materialized_views_with_dropped_target_table)
|
||||
continue;
|
||||
|
||||
throw Exception(
|
||||
ErrorCodes::UNKNOWN_TABLE,
|
||||
"Target table '{}' of view '{}' doesn't exists. To ignore this view use setting "
|
||||
"ignore_materialized_views_with_dropped_target_table",
|
||||
materialized_view->getTargetTableId().getFullTableName(),
|
||||
view_id.getFullTableName());
|
||||
}
|
||||
|
||||
auto inner_table_id = inner_table->getStorageID();
|
||||
auto inner_metadata_snapshot = inner_table->getInMemoryMetadataPtr();
|
||||
|
||||
|
@ -73,6 +73,7 @@ public:
|
||||
|
||||
StoragePtr getTargetTable() const;
|
||||
StoragePtr tryGetTargetTable() const;
|
||||
StorageID getTargetTableId() const;
|
||||
|
||||
/// Get the virtual column of the target table;
|
||||
NamesAndTypesList getVirtuals() const override;
|
||||
@ -119,7 +120,6 @@ private:
|
||||
std::tuple<ContextMutablePtr, std::shared_ptr<ASTInsertQuery>> prepareRefresh() const;
|
||||
StorageID exchangeTargetTable(StorageID fresh_table, ContextPtr refresh_context);
|
||||
|
||||
StorageID getTargetTableId() const;
|
||||
void setTargetTableId(StorageID id);
|
||||
void updateTargetTableId(std::optional<String> database_name, std::optional<String> table_name);
|
||||
};
|
||||
|
@ -14,7 +14,7 @@ function insert {
|
||||
offset=500
|
||||
while true;
|
||||
do
|
||||
${CLICKHOUSE_CLIENT} -q "INSERT INTO test_race_condition_landing SELECT number, toString(number), toString(number) from system.numbers limit $i, $offset"
|
||||
${CLICKHOUSE_CLIENT} -q "INSERT INTO test_race_condition_landing SELECT number, toString(number), toString(number) from system.numbers limit $i, $offset settings ignore_materialized_views_with_dropped_target_table=1"
|
||||
i=$(( $i + $RANDOM % 100 + 400 ))
|
||||
done
|
||||
}
|
||||
|
@ -0,0 +1,4 @@
|
||||
42
|
||||
42
|
||||
42
|
||||
42
|
@ -0,0 +1,21 @@
|
||||
set ignore_materialized_views_with_dropped_target_table = 1;
|
||||
drop table if exists from_table;
|
||||
drop table if exists to_table;
|
||||
drop table if exists mv;
|
||||
|
||||
create table from_table (x UInt32) engine=MergeTree order by x;
|
||||
create table to_table (x UInt32) engine=MergeTree order by x;
|
||||
create materialized view mv to to_table as select * from from_table;
|
||||
|
||||
insert into from_table select 42;
|
||||
select * from from_table;
|
||||
select * from to_table;
|
||||
|
||||
drop table to_table;
|
||||
|
||||
insert into from_table select 42;
|
||||
select * from from_table;
|
||||
|
||||
drop table from_table;
|
||||
drop view mv;
|
||||
|
Loading…
Reference in New Issue
Block a user