mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-29 19:12:03 +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());
|
||||
/// 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
|
||||
/// 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.
|
||||
std::unordered_map<const ActionsDAG::Node *, IFunctionBase::ShortCircuitSettings> short_circuit_nodes;
|
||||
IFunctionBase::ShortCircuitSettings short_circuit_settings;
|
||||
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())
|
||||
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