mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-12-13 18:02:24 +00:00
d60a02829f
I noticed this while working on another feature - if a set of keys being passed to `hasKeys` contains duplicates, then only one of the result slots for these keys will be populated. My fix uses to a simpler implementation which is likely slower, but is correct, which seems more important. No doubt faster approaches exist which are also correct.
57 lines
2.2 KiB
SQL
57 lines
2.2 KiB
SQL
-- Tags: no-backward-compatibility-check
|
|
DROP DATABASE IF EXISTS 02366_dictionary_db;
|
|
CREATE DATABASE 02366_dictionary_db;
|
|
|
|
CREATE TABLE 02366_dictionary_db.dict_data
|
|
(
|
|
id UInt64,
|
|
val String
|
|
)
|
|
ENGINE = Memory;
|
|
|
|
CREATE TABLE 02366_dictionary_db.lookup_data
|
|
(
|
|
id UInt64,
|
|
lookup_key UInt64,
|
|
)
|
|
ENGINE = Memory;
|
|
|
|
INSERT INTO 02366_dictionary_db.dict_data VALUES(0, 'value_0');
|
|
|
|
INSERT INTO 02366_dictionary_db.lookup_data VALUES(0, 0);
|
|
INSERT INTO 02366_dictionary_db.lookup_data VALUES(1, 0);
|
|
INSERT INTO 02366_dictionary_db.lookup_data VALUES(2, 0);
|
|
INSERT INTO 02366_dictionary_db.lookup_data VALUES(3, 1);
|
|
INSERT INTO 02366_dictionary_db.lookup_data VALUES(4, 0);
|
|
INSERT INTO 02366_dictionary_db.lookup_data VALUES(5, 1);
|
|
INSERT INTO 02366_dictionary_db.lookup_data VALUES(6, 0);
|
|
INSERT INTO 02366_dictionary_db.lookup_data VALUES(7, 2);
|
|
INSERT INTO 02366_dictionary_db.lookup_data VALUES(8, 1);
|
|
INSERT INTO 02366_dictionary_db.lookup_data VALUES(9, 0);
|
|
|
|
CREATE DICTIONARY 02366_dictionary_db.dict0
|
|
(
|
|
id UInt64,
|
|
val String
|
|
)
|
|
PRIMARY KEY id
|
|
SOURCE(CLICKHOUSE(HOST 'localhost' PORT tcpPort() USER 'default' TABLE 'dict_data'))
|
|
LAYOUT(DIRECT());
|
|
|
|
SELECT lookup_key FROM 02366_dictionary_db.lookup_data ORDER BY id ASC;
|
|
SELECT id, lookup_key, dictHas(02366_dictionary_db.dict0, lookup_key) FROM 02366_dictionary_db.lookup_data ORDER BY id ASC;
|
|
|
|
-- Nesting this way seems to help it make all the lookups as a single block, although even then it isn't guaranteed
|
|
SELECT dictHas(02366_dictionary_db.dict0, lk) FROM (SELECT any(lookup_key) as lk FROM 02366_dictionary_db.lookup_data group by id ORDER BY id ASC);
|
|
-- Same with this group by
|
|
SELECT dictHas(02366_dictionary_db.dict0, any(lookup_key)) FROM 02366_dictionary_db.lookup_data GROUP BY id ORDER BY id ASC;
|
|
|
|
|
|
SELECT dictHas(02366_dictionary_db.dict0, lookup_key) FROM 02366_dictionary_db.lookup_data ORDER BY id ASC;
|
|
SELECT dictGetOrDefault(02366_dictionary_db.dict0, 'val', lookup_key, 'UNKNOWN') FROM 02366_dictionary_db.lookup_data ORDER BY id ASC;
|
|
SELECT count(), has FROM 02366_dictionary_db.lookup_data group by dictHas(02366_dictionary_db.dict0, lookup_key) as has;
|
|
|
|
DROP DICTIONARY 02366_dictionary_db.dict0;
|
|
DROP TABLE 02366_dictionary_db.lookup_data;
|
|
DROP TABLE 02366_dictionary_db.dict_data;
|