mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-12-01 20:12:02 +00:00
Merge pull request #65802 from jsc0218/FixBugInShortCircuitLogic
Fix Short Circuit Logic
This commit is contained in:
commit
f2a39ae2f1
@ -195,6 +195,10 @@ static void setLazyExecutionInfo(
|
|||||||
}
|
}
|
||||||
|
|
||||||
lazy_execution_info.short_circuit_ancestors_info[parent].insert(indexes.begin(), indexes.end());
|
lazy_execution_info.short_circuit_ancestors_info[parent].insert(indexes.begin(), indexes.end());
|
||||||
|
/// After checking arguments_with_disabled_lazy_execution, if there is no relation with parent,
|
||||||
|
/// disable the current node.
|
||||||
|
if (indexes.empty())
|
||||||
|
lazy_execution_info.can_be_lazy_executed = false;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
/// If lazy execution is disabled for one of parents, we should disable it for current node.
|
/// If lazy execution is disabled for one of parents, we should disable it for current node.
|
||||||
@ -292,9 +296,9 @@ static std::unordered_set<const ActionsDAG::Node *> processShortCircuitFunctions
|
|||||||
|
|
||||||
/// Firstly, find all short-circuit functions and get their settings.
|
/// Firstly, find all short-circuit functions and get their settings.
|
||||||
std::unordered_map<const ActionsDAG::Node *, IFunctionBase::ShortCircuitSettings> short_circuit_nodes;
|
std::unordered_map<const ActionsDAG::Node *, IFunctionBase::ShortCircuitSettings> short_circuit_nodes;
|
||||||
IFunctionBase::ShortCircuitSettings short_circuit_settings;
|
|
||||||
for (const auto & node : nodes)
|
for (const auto & node : nodes)
|
||||||
{
|
{
|
||||||
|
IFunctionBase::ShortCircuitSettings short_circuit_settings;
|
||||||
if (node.type == ActionsDAG::ActionType::FUNCTION && node.function_base->isShortCircuit(short_circuit_settings, node.children.size()) && !node.children.empty())
|
if (node.type == ActionsDAG::ActionType::FUNCTION && node.function_base->isShortCircuit(short_circuit_settings, node.children.size()) && !node.children.empty())
|
||||||
short_circuit_nodes[&node] = short_circuit_settings;
|
short_circuit_nodes[&node] = short_circuit_settings;
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1 @@
|
|||||||
|
2024-01-02 16:54:59
|
62
tests/queries/0_stateless/03071_fix_short_circuit_logic.sql
Normal file
62
tests/queries/0_stateless/03071_fix_short_circuit_logic.sql
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
|
||||||
|
|
||||||
|
CREATE FUNCTION IF NOT EXISTS unhexPrefixed AS value -> unhex(substring(value, 3));
|
||||||
|
CREATE FUNCTION IF NOT EXISTS hex2bytes AS address -> CAST(unhexPrefixed(address), 'FixedString(20)');
|
||||||
|
CREATE FUNCTION IF NOT EXISTS bytes2hex AS address -> concat('0x', lower(hex(address)));
|
||||||
|
|
||||||
|
CREATE TABLE test
|
||||||
|
(
|
||||||
|
`transfer_id` String,
|
||||||
|
`address` FixedString(20),
|
||||||
|
`value` UInt256,
|
||||||
|
`block_timestamp` DateTime('UTC'),
|
||||||
|
`token_address` FixedString(20)
|
||||||
|
)
|
||||||
|
ENGINE = MergeTree
|
||||||
|
PARTITION BY toYYYYMM(block_timestamp)
|
||||||
|
PRIMARY KEY (address, block_timestamp)
|
||||||
|
ORDER BY (address, block_timestamp);
|
||||||
|
|
||||||
|
INSERT INTO test SELECT 'token-transfer-0x758f1bbabb160683e1c80ed52dcd24a32b599d40edf1cec91b5f1199c0e392a2-56', hex2bytes('0xd387a6e4e84a6c86bd90c158c6028a58cc8ac459'), 3000000000000000000000, '2024-01-02 16:54:59', 'abc';
|
||||||
|
|
||||||
|
CREATE TABLE token_data
|
||||||
|
(
|
||||||
|
token_address_hex String,
|
||||||
|
chain String,
|
||||||
|
is_blacklisted Bool
|
||||||
|
)
|
||||||
|
ENGINE = TinyLog;
|
||||||
|
|
||||||
|
INSERT INTO token_data SELECT bytes2hex('abc'), 'zksync', false;
|
||||||
|
|
||||||
|
CREATE DICTIONARY token_data_map
|
||||||
|
(
|
||||||
|
token_address_hex String,
|
||||||
|
chain String,
|
||||||
|
is_blacklisted Bool
|
||||||
|
)
|
||||||
|
PRIMARY KEY token_address_hex, chain
|
||||||
|
SOURCE(Clickhouse(table token_data))
|
||||||
|
LIFETIME(MIN 200 MAX 300)
|
||||||
|
LAYOUT(COMPLEX_KEY_HASHED_ARRAY());
|
||||||
|
|
||||||
|
SELECT block_timestamp
|
||||||
|
FROM
|
||||||
|
(
|
||||||
|
SELECT
|
||||||
|
block_timestamp,
|
||||||
|
bytes2hex(token_address) AS token_address_hex
|
||||||
|
FROM
|
||||||
|
(
|
||||||
|
SELECT
|
||||||
|
transfer_id,
|
||||||
|
address,
|
||||||
|
value,
|
||||||
|
block_timestamp,
|
||||||
|
token_address,
|
||||||
|
'zksync' AS chain
|
||||||
|
FROM test
|
||||||
|
)
|
||||||
|
WHERE (address = hex2bytes('0xd387a6e4e84a6c86bd90c158c6028a58cc8ac459')) AND (transfer_id NOT LIKE 'gas%') AND (value > 0) AND (dictGetOrDefault(token_data_map, 'is_blacklisted', (token_address_hex, 'zksync'), true))
|
||||||
|
)
|
||||||
|
SETTINGS max_threads = 1, short_circuit_function_evaluation = 'enable', allow_experimental_analyzer = 0;
|
Loading…
Reference in New Issue
Block a user