ipv6 адрес как FixedString(16) - получаю не то, что на входе.
Делаю таким тестовым скриптом:
#!/bin/bash
DB=proba
DATATABLE=iptest
# for debug: start from scratch
clickhouse-client —echo —database=$DB —query="DROP TABLE IF EXISTS $DB.$DATATABLE"
echo Creating table $DB.$DATATABLE if needed
clickhouse-client —echo —database=$DB —multiline —query="CREATE TABLE IF NOT EXISTS $DB.$DATATABLE ("\
"d Date,
ip_prefix String,
ip6 FixedString(16) default toFixedString('',16),
ip6str String,
prefix_len UInt8
) ENGINE = MergeTree(d, (d, ip6), 8192)"
echo '{"timestamp": "2017-09-14", "ip_prefix": "2a0b:aa80::/29"}' \
| clickhouse-local —table=TMP \
—input-format=JSONEachRow \
—verbose \
—structure='timestamp String,ip_prefix String' \
—query=\
"SELECT
timestamp,
ip_prefix,
(position(ip_prefix,':') > 0) ? IPv6StringToNum(extract(ip_prefix,'^(.+)/')) : IPv6StringToNum('0') as ip6,
(position(ip_prefix,':') > 0) ? extract(ip_prefix,'^(.+)/') : '' as ip6str,
(position(ip_prefix,'/') > 0) ? toUInt8(extract(ip_prefix,'/([0-9]+)')) : 0 as prefix_len
FROM TMP FORMAT CSV" \
| clickhouse-client —database=$DB —query="INSERT INTO $DB.$DATATABLE FORMAT CSV" —progress
clickhouse-client —database=$DB —query="SELECT *, IPv6NumToString(ip6) as ip6fromNum, IPv6NumToString(IPv6StringToNum('2a0b:aa80::')) FROM $DB.$DATATABLE FORMAT Vertical"
В результатет получаю такое:DROP TABLE IF EXISTS proba.iptest
Creating table proba.iptest if needed
CREATE TABLE IF NOT EXISTS proba.iptest (d Date,
ip_prefix String,
ip6 FixedString(16) default toFixedString('',16),
ip6str String,
prefix_len UInt8
) ENGINE = MergeTree(d, (d, ip6), 8192)
Executing query: CREATE TABLE TMP (timestamp String,ip_prefix String) ENGINE = File(JSONEachRow, stdin)
Executing query: SELECT
timestamp,
ip_prefix,
(position(ip_prefix,':') > 0) ? IPv6StringToNum(extract(ip_prefix,'^(.+)/')) : IPv6StringToNum('0') as ip6,
(position(ip_prefix,':') > 0) ? extract(ip_prefix,'^(.+)/') : '' as ip6str,
(position(ip_prefix,'/') > 0) ? toUInt8(extract(ip_prefix,'/([0-9]+)')) : 0 as prefix_len
FROM TMP FORMAT CSV
Read 1 rows, 42.00 B in 0.005 sec., 190 rows/sec., 7.82 KiB/sec.
Row 1:
──────
d: 2017-09-14
ip_prefix: 2a0b:aa80::/29
ip6: \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0
ip6str: 2a0b:aa80::
prefix_len: 29
ip6fromNum: 1100:: <------— откуда здесь такое значение вместо 2a0b:aa80:: ?
IPv6NumToString(IPv6StringToNum(\'2a0b:aa80::\')): 2a0b:aa80::
Неужто никто не ткнёт пальцем в чём косяк? Кладу в базу одно значение, а вынимаю другое. Вроде простая штука и всё по букварю делаю...
http://paste.org.ru/?6izk35 - похоже что норм, а какая версия?
Обсуждают сегодня