Clickhouse: UUID field type

Created on 15 Jan 2018  ·  15Comments  ·  Source: ClickHouse/ClickHouse

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?

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.)

All 15 comments

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.

Was this page helpful?
0 / 5 - 0 ratings

Related issues

zhicwu picture zhicwu  ·  3Comments

derekperkins picture derekperkins  ·  3Comments

vixa2012 picture vixa2012  ·  3Comments

healiseu picture healiseu  ·  3Comments

fizerkhan picture fizerkhan  ·  3Comments