Skip to content

Commit 1c1d193

Browse files
authored
Merge pull request ClickHouse#75771 from aalexfvk/fix_ttl_parsing_on_attach
Fix `allow_suspicious_ttl_expressions` misbehaviour
2 parents f8d2492 + ea6ef2b commit 1c1d193

File tree

5 files changed

+66
-4
lines changed

5 files changed

+66
-4
lines changed

src/Storages/MergeTree/ReplicatedMergeTreeTableMetadata.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -347,7 +347,9 @@ void ReplicatedMergeTreeTableMetadata::checkEquals(const ReplicatedMergeTreeTabl
347347
}
348348

349349
auto parsed_primary_key = KeyDescription::parse(primary_key, columns, context, true);
350-
String parsed_zk_ttl_table = formattedAST(TTLTableDescription::parse(from_zk.ttl_table, columns, context, parsed_primary_key).definition_ast);
350+
// Strict checking of suspicious TTL is not needed here
351+
String parsed_zk_ttl_table = formattedAST(
352+
TTLTableDescription::parse(from_zk.ttl_table, columns, context, parsed_primary_key, /* is_attach = */ true).definition_ast);
351353
if (ttl_table != parsed_zk_ttl_table)
352354
{
353355
throw Exception(ErrorCodes::METADATA_MISMATCH, "Existing table metadata in ZooKeeper differs in TTL. "

src/Storages/TTLDescription.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -436,7 +436,8 @@ TTLTableDescription TTLTableDescription::getTTLForTableFromAST(
436436
return result;
437437
}
438438

439-
TTLTableDescription TTLTableDescription::parse(const String & str, const ColumnsDescription & columns, ContextPtr context, const KeyDescription & primary_key)
439+
TTLTableDescription TTLTableDescription::parse(
440+
const String & str, const ColumnsDescription & columns, ContextPtr context, const KeyDescription & primary_key, bool is_attach)
440441
{
441442
TTLTableDescription result;
442443
if (str.empty())
@@ -446,7 +447,7 @@ TTLTableDescription TTLTableDescription::parse(const String & str, const Columns
446447
ASTPtr ast = parseQuery(parser, str, 0, DBMS_DEFAULT_MAX_PARSER_DEPTH, DBMS_DEFAULT_MAX_PARSER_BACKTRACKS);
447448
FunctionNameNormalizer::visit(ast.get());
448449

449-
return getTTLForTableFromAST(ast, columns, context, primary_key, context->getSettingsRef()[Setting::allow_suspicious_ttl_expressions]);
450+
return getTTLForTableFromAST(ast, columns, context, primary_key, is_attach);
450451
}
451452

452453
}

src/Storages/TTLDescription.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ struct TTLTableDescription
139139
const ASTPtr & definition_ast, const ColumnsDescription & columns, ContextPtr context, const KeyDescription & primary_key, bool is_attach);
140140

141141
/// Parse description from string
142-
static TTLTableDescription parse(const String & str, const ColumnsDescription & columns, ContextPtr context, const KeyDescription & primary_key);
142+
static TTLTableDescription parse(const String & str, const ColumnsDescription & columns, ContextPtr context, const KeyDescription & primary_key, bool is_attach);
143143
};
144144

145145
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
CREATE TABLE default.replicated_ttl_00933\n(\n `a` Int32 TTL now() + toIntervalDay(1),\n `d` DateTime\n)\nENGINE = ReplicatedMergeTree(\'/clickhouse/tables/default/test_ttl_00933\', \'r1\')\nORDER BY d\nSETTINGS index_granularity = 8192
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
-- Tags: long, zookeeper
2+
3+
-- Replicated
4+
5+
SET allow_suspicious_ttl_expressions = 0;
6+
DROP TABLE IF EXISTS replicated_ttl_00933 SYNC;
7+
8+
-- Create
9+
CREATE TABLE replicated_ttl_00933 (a Int32, d DateTime)
10+
ENGINE=ReplicatedMergeTree('/clickhouse/tables/{database}/test_ttl_00933', 'r1')
11+
ORDER BY a PARTITION BY tuple() TTL now() + INTERVAL 1 second; -- { serverError BAD_ARGUMENTS }
12+
13+
SET allow_suspicious_ttl_expressions = 1;
14+
15+
CREATE TABLE replicated_ttl_00933 (a Int32, d DateTime)
16+
ENGINE=ReplicatedMergeTree('/clickhouse/tables/{database}/test_ttl_00933', 'r1')
17+
ORDER BY a PARTITION BY tuple() TTL now() + INTERVAL 1 second;
18+
19+
-- Alter
20+
SET allow_suspicious_ttl_expressions = 0;
21+
ALTER TABLE replicated_ttl_00933 MODIFY TTL now() + interval 1 day; -- { serverError BAD_ARGUMENTS }
22+
23+
SET allow_suspicious_ttl_expressions = 1;
24+
ALTER TABLE replicated_ttl_00933 MODIFY TTL now() + interval 1 day;
25+
26+
DROP TABLE IF EXISTS replicated_ttl_00933 SYNC;
27+
28+
-- Column TTL
29+
SET allow_suspicious_ttl_expressions = 0;
30+
31+
CREATE TABLE replicated_ttl_00933
32+
(
33+
a Int32 TTL now() + INTERVAL 1 second,
34+
d DateTime
35+
)
36+
ENGINE=ReplicatedMergeTree('/clickhouse/tables/{database}/test_ttl_00933', 'r1')
37+
ORDER BY d; -- { serverError BAD_ARGUMENTS }
38+
39+
SET allow_suspicious_ttl_expressions = 1;
40+
41+
CREATE TABLE replicated_ttl_00933
42+
(
43+
a Int32 TTL now() + INTERVAL 1 second,
44+
d DateTime
45+
)
46+
ENGINE=ReplicatedMergeTree('/clickhouse/tables/{database}/test_ttl_00933', 'r1')
47+
ORDER BY d;
48+
49+
-- Alter column TTL
50+
SET allow_suspicious_ttl_expressions = 0;
51+
ALTER TABLE replicated_ttl_00933 MODIFY COLUMN a Int32 TTL now() + INTERVAL 1 day; -- { serverError BAD_ARGUMENTS }
52+
53+
SET allow_suspicious_ttl_expressions = 1;
54+
ALTER TABLE replicated_ttl_00933 MODIFY COLUMN a Int32 TTL now() + INTERVAL 1 day;
55+
56+
57+
SHOW CREATE TABLE replicated_ttl_00933;
58+
DROP TABLE IF EXISTS replicated_ttl_00933 SYNC;

0 commit comments

Comments
 (0)