Looks like bug in new data type UUID.
Used version 1.1.54327
I can create table with uuid field, insert data using simple string, representing uuid like '0c5049ab-a9fe-46c6-aee6-bcb5e414a19c'
The problem in using UUID typed field in WHERE clause;
Example:
CREATE TABLE test (id UUID, gmt DateTime, date_index Date) ENGINE = MergeTree(date_index, (alert_id, gmt), 8192);
INSERT INTO uvo.pos (gmt, id, date_index) VALUES( '0c5049ab-a9fe-46c6-aee6-bcb5e414a19c','2018-01-10 22:24:35', '2018-01-11');
its ok;
now i can select ALL data:
select * from test;
┌──────────────id─┬────────────────────gmt─┐
│ 0c5049ab-a9fe-46c6-aee6-bcb5e414a19c │ 2018-01-10 22:24:35 │
└──────────────────────────┴──────────────┘
If i try to provide ID field:
SELECT
id, gmt
FROM test
WHERE id = '0c5049ab-a9fe-46c6-aee6-bcb5e414a19c'
Got: DB::Exception: Bad type of Field
Ok, there are function: toUUID, lets try:
SELECT
id, gmt
FROM test
WHERE id = toUUID('0c5049ab-a9fe-46c6-aee6-bcb5e414a19c');
Same result.
By the way:
SELECT
toTypeName(id),
toTypeName(toUUID('0c5049ab-a9fe-46c6-aee6-bcb5e414a19c'))
FROM test;
toTypeName(id)─┬─toTypeName(toUUID(\'0c5049ab-a9fe-46c6-aee6-bcb5e414a19c\'))─┐
│ UUID │ UUID │
└──────────┴────────────────────────────────────────
Only one method i found was:
SELECT
materialize(id) as id, gmt
FROM test
WHERE id = toUUID('0c5049ab-a9fe-46c6-aee6-bcb5e414a19c');
That works.
Please tell me where i was wrong?
Hello!
Could you say when this bug will be fixed?
It's very critical for our development team now.
Разработчики ничего не ответили, так что я перешел на использование FixedString(16) и UUIDStringToNum(). Это работает, как я понимаю с той же скоростью...
То есть uuid храните в CH как FixedString(16)?
А insert как делаете? Есть ли способ инсертить uuid как 36 символьную строку, чтобы clickhouse сам ее переводил в FixedString(16)?
Всё по документации:
UUIDStringToNum(str)
Принимает строку, содержащую 36 символов в формате 123e4567-e89b-12d3-a456-426655440000, и возвращает в виде набора байт в FixedString(16).
UUIDNumToString(str)
Принимает значение типа FixedString(16). Возвращает строку из 36 символов в текстовом виде.
То есть данные хранятся в бинарной строке, поиск WHERE field = UUIDStringToNum(текстовое представление UUID)
Вставлять тоже так можно
тут много было про данный формат.
Спасибо, стало понятно. Я просто использовал JSONEachRow при вставке. При его использовании, как я понял, конструкцию UUIDStringToNum(текстовое представление UUID) не удастся вставить.
Придется переходить на другой формат.
А вы в каком формате делаете инсерт?
Я пытаюсь с помощью обычного VALUES вставлять
Если вставлять по 100 строк, то все ок
Если по 1000 и больше начинают валиться подобные ошибки:
DB::Exception: Unknown identifier: UUIDStringToNum, e.what() = DB::Exception
Или
DB::Exception: Unknown identifier: UUIDStrin, e.what() = DB::Exception
Я бинарном виде вставляю, проблем в 1000 строк не было...
По моему при вставке можно просто строку указать, без UUIDStringToNum. Но это не точно
То есть RowBinary форматом? А строки сами кодируете в нужный формат? Или может есть какой то encoder готовый?
На golang драйвер передает, я использую tcp подключение, не http
Hey, did you solve it? How to filter with uuid in WHERE?
@deonwise, @alexm93, @simPod, есть такое костыль :
SELECT uuid
FROM test.test
WHERE uuid IN ('5b2f98bd-272b-020c-6004-145100001003')
┌─────────────────────────────────uuid─┐
│ 5b2f98bd-272b-020c-6004-145100001003 │
└────────────────────────────────── ──┘
1 rows in set. Elapsed: 0.006 sec. Processed 1.02 thousand rows, 16.38 KB (174.61 thousand rows/s., 2.79 MB/s.)
Thanks for sharing! A bit non-standard tho
In master.
Most helpful comment
@deonwise, @alexm93, @simPod, есть такое костыль :
SELECT uuid
FROM test.test
WHERE uuid IN ('5b2f98bd-272b-020c-6004-145100001003')
┌─────────────────────────────────uuid─┐
│ 5b2f98bd-272b-020c-6004-145100001003 │
└────────────────────────────────── ──┘
1 rows in set. Elapsed: 0.006 sec. Processed 1.02 thousand rows, 16.38 KB (174.61 thousand rows/s., 2.79 MB/s.)