mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-09-20 08:40:50 +00:00
Merge branch 'master' into persistent_nukeeper_snapshot_storage
This commit is contained in:
commit
c4a6289a9b
@ -5,7 +5,7 @@ toc_title: Brown University Benchmark
|
||||
|
||||
# Brown University Benchmark
|
||||
|
||||
MgBench - A new analytical benchmark for machine-generated log data, [Andrew Crotty](http://cs.brown.edu/people/acrotty/).
|
||||
`MgBench` is a new analytical benchmark for machine-generated log data, [Andrew Crotty](http://cs.brown.edu/people/acrotty/).
|
||||
|
||||
Download the data:
|
||||
```
|
||||
@ -153,7 +153,7 @@ ORDER BY dt,
|
||||
hr;
|
||||
|
||||
|
||||
-- Q1.4: Over a 1-month period, how often was each server blocked on disk I/O?
|
||||
-- Q1.4: Over 1 month, how often was each server blocked on disk I/O?
|
||||
|
||||
SELECT machine_name,
|
||||
COUNT(*) AS spikes
|
||||
@ -301,7 +301,7 @@ WHERE event_type = 'temperature'
|
||||
AND log_time >= '2019-11-29 17:00:00.000';
|
||||
|
||||
|
||||
-- Q3.4: Over the past 6 months, how frequently was each door opened?
|
||||
-- Q3.4: Over the past 6 months, how frequently were each door opened?
|
||||
|
||||
SELECT device_name,
|
||||
device_floor,
|
||||
@ -412,3 +412,5 @@ ORDER BY yr,
|
||||
```
|
||||
|
||||
The data is also available for interactive queries in the [Playground](https://gh-api.clickhouse.tech/play?user=play), [example](https://gh-api.clickhouse.tech/play?user=play#U0VMRUNUIG1hY2hpbmVfbmFtZSwKICAgICAgIE1JTihjcHUpIEFTIGNwdV9taW4sCiAgICAgICBNQVgoY3B1KSBBUyBjcHVfbWF4LAogICAgICAgQVZHKGNwdSkgQVMgY3B1X2F2ZywKICAgICAgIE1JTihuZXRfaW4pIEFTIG5ldF9pbl9taW4sCiAgICAgICBNQVgobmV0X2luKSBBUyBuZXRfaW5fbWF4LAogICAgICAgQVZHKG5ldF9pbikgQVMgbmV0X2luX2F2ZywKICAgICAgIE1JTihuZXRfb3V0KSBBUyBuZXRfb3V0X21pbiwKICAgICAgIE1BWChuZXRfb3V0KSBBUyBuZXRfb3V0X21heCwKICAgICAgIEFWRyhuZXRfb3V0KSBBUyBuZXRfb3V0X2F2ZwpGUk9NICgKICBTRUxFQ1QgbWFjaGluZV9uYW1lLAogICAgICAgICBDT0FMRVNDRShjcHVfdXNlciwgMC4wKSBBUyBjcHUsCiAgICAgICAgIENPQUxFU0NFKGJ5dGVzX2luLCAwLjApIEFTIG5ldF9pbiwKICAgICAgICAgQ09BTEVTQ0UoYnl0ZXNfb3V0LCAwLjApIEFTIG5ldF9vdXQKICBGUk9NIG1nYmVuY2gubG9nczEKICBXSEVSRSBtYWNoaW5lX25hbWUgSU4gKCdhbmFuc2knLCdhcmFnb2cnLCd1cmQnKQogICAgQU5EIGxvZ190aW1lID49IFRJTUVTVEFNUCAnMjAxNy0wMS0xMSAwMDowMDowMCcKKSBBUyByCkdST1VQIEJZIG1hY2hpbmVfbmFtZQ==).
|
||||
|
||||
[Original article](https://clickhouse.tech/docs/en/getting_started/example_datasets/brown-benchmark/) <!--hide-->
|
||||
|
@ -1104,7 +1104,7 @@ The maximum number of replicas for each shard when executing a query. In limited
|
||||
- the sampling key is an expression that is expensive to calculate
|
||||
- the cluster's latency distribution has a long tail, so that querying more servers increases the query's overall latency
|
||||
|
||||
In addition, this setting will produce incorrect results when joins or subqueries are involved, and all tables don't meet certain conditions. See [Distributed Subqueries and max_parallel_replicas](../../sql-reference/operators/in.md/#max_parallel_replica-subqueries) for more details.
|
||||
In addition, this setting will produce incorrect results when joins or subqueries are involved, and all tables don't meet certain conditions. See [Distributed Subqueries and max_parallel_replicas](../../sql-reference/operators/in.md#max_parallel_replica-subqueries) for more details.
|
||||
|
||||
## compile {#compile}
|
||||
|
||||
|
@ -9,7 +9,7 @@ Calculates the arithmetic mean.
|
||||
**Syntax**
|
||||
|
||||
``` sql
|
||||
avgWeighted(x)
|
||||
avg(x)
|
||||
```
|
||||
|
||||
**Arguments**
|
||||
|
@ -693,6 +693,178 @@ Same as for [parseDateTimeBestEffort](#parsedatetimebesteffort) except that it r
|
||||
|
||||
Same as for [parseDateTimeBestEffort](#parsedatetimebesteffort) except that it returns zero date or zero date time when it encounters a date format that cannot be processed.
|
||||
|
||||
## parseDateTimeBestEffortUSOrNull {#parsedatetimebesteffortusornull}
|
||||
|
||||
Same as [parseDateTimeBestEffortUS](#parsedatetimebesteffortUS) function except that it returns `NULL` when it encounters a date format that cannot be processed.
|
||||
|
||||
**Syntax**
|
||||
|
||||
``` sql
|
||||
parseDateTimeBestEffortUSOrNull(time_string[, time_zone])
|
||||
```
|
||||
|
||||
**Parameters**
|
||||
|
||||
- `time_string` — String containing a date or date with time to convert. The date must be in the US date format (`MM/DD/YYYY`, etc). [String](../../sql-reference/data-types/string.md).
|
||||
- `time_zone` — [Timezone](../../operations/server-configuration-parameters/settings.md#server_configuration_parameters-timezone). The function parses `time_string` according to the timezone. Optional. [String](../../sql-reference/data-types/string.md).
|
||||
|
||||
**Supported non-standard formats**
|
||||
|
||||
- A string containing 9..10 digit [unix timestamp](https://en.wikipedia.org/wiki/Unix_time).
|
||||
- A string with a date and a time components: `YYYYMMDDhhmmss`, `MM/DD/YYYY hh:mm:ss`, `MM-DD-YY hh:mm`, `YYYY-MM-DD hh:mm:ss`, etc.
|
||||
- A string with a date, but no time component: `YYYY`, `YYYYMM`, `YYYY*MM`, `MM/DD/YYYY`, `MM-DD-YY`, etc.
|
||||
- A string with a day and time: `DD`, `DD hh`, `DD hh:mm`. In this case, `YYYY-MM` are substituted with `2000-01`.
|
||||
- A string that includes date and time along with timezone offset information: `YYYY-MM-DD hh:mm:ss ±h:mm`, etc. For example, `2020-12-12 17:36:00 -5:00`.
|
||||
|
||||
**Returned values**
|
||||
|
||||
- `time_string` converted to the [DateTime](../../sql-reference/data-types/datetime.md) data type.
|
||||
- `NULL` if the input string cannot be converted to the `DateTime` data type.
|
||||
|
||||
**Examples**
|
||||
|
||||
Query:
|
||||
|
||||
``` sql
|
||||
SELECT parseDateTimeBestEffortUSOrNull('02/10/2021 21:12:57') AS parseDateTimeBestEffortUSOrNull;
|
||||
```
|
||||
|
||||
Result:
|
||||
|
||||
``` text
|
||||
┌─parseDateTimeBestEffortUSOrNull─┐
|
||||
│ 2021-02-10 21:12:57 │
|
||||
└─────────────────────────────────┘
|
||||
```
|
||||
|
||||
Query:
|
||||
|
||||
``` sql
|
||||
SELECT parseDateTimeBestEffortUSOrNull('02-10-2021 21:12:57 GMT', 'Europe/Moscow') AS parseDateTimeBestEffortUSOrNull;
|
||||
```
|
||||
|
||||
Result:
|
||||
|
||||
``` text
|
||||
┌─parseDateTimeBestEffortUSOrNull─┐
|
||||
│ 2021-02-11 00:12:57 │
|
||||
└─────────────────────────────────┘
|
||||
```
|
||||
|
||||
Query:
|
||||
|
||||
``` sql
|
||||
SELECT parseDateTimeBestEffortUSOrNull('02.10.2021') AS parseDateTimeBestEffortUSOrNull;
|
||||
```
|
||||
|
||||
Result:
|
||||
|
||||
``` text
|
||||
┌─parseDateTimeBestEffortUSOrNull─┐
|
||||
│ 2021-02-10 00:00:00 │
|
||||
└─────────────────────────────────┘
|
||||
```
|
||||
|
||||
Query:
|
||||
|
||||
``` sql
|
||||
SELECT parseDateTimeBestEffortUSOrNull('10.2021') AS parseDateTimeBestEffortUSOrNull;
|
||||
```
|
||||
|
||||
Result:
|
||||
|
||||
``` text
|
||||
┌─parseDateTimeBestEffortUSOrNull─┐
|
||||
│ ᴺᵁᴸᴸ │
|
||||
└─────────────────────────────────┘
|
||||
```
|
||||
|
||||
## parseDateTimeBestEffortUSOrZero {#parsedatetimebesteffortusorzero}
|
||||
|
||||
Same as [parseDateTimeBestEffortUS](#parsedatetimebesteffortUS) function except that it returns zero date (`1970-01-01`) or zero date with time (`1970-01-01 00:00:00`) when it encounters a date format that cannot be processed.
|
||||
|
||||
**Syntax**
|
||||
|
||||
``` sql
|
||||
parseDateTimeBestEffortUSOrZero(time_string[, time_zone])
|
||||
```
|
||||
|
||||
**Parameters**
|
||||
|
||||
- `time_string` — String containing a date or date with time to convert. The date must be in the US date format (`MM/DD/YYYY`, etc). [String](../../sql-reference/data-types/string.md).
|
||||
- `time_zone` — [Timezone](../../operations/server-configuration-parameters/settings.md#server_configuration_parameters-timezone). The function parses `time_string` according to the timezone. Optional. [String](../../sql-reference/data-types/string.md).
|
||||
|
||||
**Supported non-standard formats**
|
||||
|
||||
- A string containing 9..10 digit [unix timestamp](https://en.wikipedia.org/wiki/Unix_time).
|
||||
- A string with a date and a time components: `YYYYMMDDhhmmss`, `MM/DD/YYYY hh:mm:ss`, `MM-DD-YY hh:mm`, `YYYY-MM-DD hh:mm:ss`, etc.
|
||||
- A string with a date, but no time component: `YYYY`, `YYYYMM`, `YYYY*MM`, `MM/DD/YYYY`, `MM-DD-YY`, etc.
|
||||
- A string with a day and time: `DD`, `DD hh`, `DD hh:mm`. In this case, `YYYY-MM` are substituted with `2000-01`.
|
||||
- A string that includes date and time along with timezone offset information: `YYYY-MM-DD hh:mm:ss ±h:mm`, etc. For example, `2020-12-12 17:36:00 -5:00`.
|
||||
|
||||
**Returned values**
|
||||
|
||||
- `time_string` converted to the [DateTime](../../sql-reference/data-types/datetime.md) data type.
|
||||
- Zero date or zero date with time if the input string cannot be converted to the `DateTime` data type.
|
||||
|
||||
**Examples**
|
||||
|
||||
Query:
|
||||
|
||||
``` sql
|
||||
SELECT parseDateTimeBestEffortUSOrZero('02/10/2021 21:12:57') AS parseDateTimeBestEffortUSOrZero;
|
||||
```
|
||||
|
||||
Result:
|
||||
|
||||
``` text
|
||||
┌─parseDateTimeBestEffortUSOrZero─┐
|
||||
│ 2021-02-10 21:12:57 │
|
||||
└─────────────────────────────────┘
|
||||
```
|
||||
|
||||
Query:
|
||||
|
||||
``` sql
|
||||
SELECT parseDateTimeBestEffortUSOrZero('02-10-2021 21:12:57 GMT', 'Europe/Moscow') AS parseDateTimeBestEffortUSOrZero;
|
||||
```
|
||||
|
||||
Result:
|
||||
|
||||
``` text
|
||||
┌─parseDateTimeBestEffortUSOrZero─┐
|
||||
│ 2021-02-11 00:12:57 │
|
||||
└─────────────────────────────────┘
|
||||
```
|
||||
|
||||
Query:
|
||||
|
||||
``` sql
|
||||
SELECT parseDateTimeBestEffortUSOrZero('02.10.2021') AS parseDateTimeBestEffortUSOrZero;
|
||||
```
|
||||
|
||||
Result:
|
||||
|
||||
``` text
|
||||
┌─parseDateTimeBestEffortUSOrZero─┐
|
||||
│ 2021-02-10 00:00:00 │
|
||||
└─────────────────────────────────┘
|
||||
```
|
||||
|
||||
Query:
|
||||
|
||||
``` sql
|
||||
SELECT parseDateTimeBestEffortUSOrZero('02.2021') AS parseDateTimeBestEffortUSOrZero;
|
||||
```
|
||||
|
||||
Result:
|
||||
|
||||
``` text
|
||||
┌─parseDateTimeBestEffortUSOrZero─┐
|
||||
│ 1970-01-01 00:00:00 │
|
||||
└─────────────────────────────────┘
|
||||
```
|
||||
|
||||
## toLowCardinality {#tolowcardinality}
|
||||
|
||||
Converts input parameter to the [LowCardianlity](../../sql-reference/data-types/lowcardinality.md) version of same data type.
|
||||
|
@ -44,7 +44,7 @@ The rest of the conditions and the `LIMIT` sampling constraint are executed in C
|
||||
A table object with the same columns as the original MySQL table.
|
||||
|
||||
!!! info "Note"
|
||||
In the `INSERT` query to distinguish table function `mysql(...)` from table name with column names list you must use keywords `FUNCTION` or `TABLE FUNCTION`. See examples below.
|
||||
In the `INSERT` query to distinguish table function `mysql(...)` from table name with column names list, you must use keywords `FUNCTION` or `TABLE FUNCTION`. See examples below.
|
||||
|
||||
**Examples**
|
||||
|
||||
|
416
docs/ru/getting-started/example-datasets/brown-benchmark.md
Normal file
416
docs/ru/getting-started/example-datasets/brown-benchmark.md
Normal file
@ -0,0 +1,416 @@
|
||||
---
|
||||
toc_priority: 20
|
||||
toc_title: Brown University Benchmark
|
||||
---
|
||||
|
||||
# Brown University Benchmark
|
||||
|
||||
`MgBench` — это аналитический тест производительности для данных журнала событий, сгенерированных машиной. Бенчмарк разработан [Andrew Crotty](http://cs.brown.edu/people/acrotty/).
|
||||
|
||||
Скачать данные:
|
||||
```
|
||||
wget https://datasets.clickhouse.tech/mgbench{1..3}.csv.xz
|
||||
```
|
||||
|
||||
Распаковать данные:
|
||||
```
|
||||
xz -v -d mgbench{1..3}.csv.xz
|
||||
```
|
||||
|
||||
Создание таблиц:
|
||||
```
|
||||
CREATE DATABASE mgbench;
|
||||
|
||||
|
||||
CREATE TABLE mgbench.logs1 (
|
||||
log_time DateTime,
|
||||
machine_name LowCardinality(String),
|
||||
machine_group LowCardinality(String),
|
||||
cpu_idle Nullable(Float32),
|
||||
cpu_nice Nullable(Float32),
|
||||
cpu_system Nullable(Float32),
|
||||
cpu_user Nullable(Float32),
|
||||
cpu_wio Nullable(Float32),
|
||||
disk_free Nullable(Float32),
|
||||
disk_total Nullable(Float32),
|
||||
part_max_used Nullable(Float32),
|
||||
load_fifteen Nullable(Float32),
|
||||
load_five Nullable(Float32),
|
||||
load_one Nullable(Float32),
|
||||
mem_buffers Nullable(Float32),
|
||||
mem_cached Nullable(Float32),
|
||||
mem_free Nullable(Float32),
|
||||
mem_shared Nullable(Float32),
|
||||
swap_free Nullable(Float32),
|
||||
bytes_in Nullable(Float32),
|
||||
bytes_out Nullable(Float32)
|
||||
)
|
||||
ENGINE = MergeTree()
|
||||
ORDER BY (machine_group, machine_name, log_time);
|
||||
|
||||
|
||||
CREATE TABLE mgbench.logs2 (
|
||||
log_time DateTime,
|
||||
client_ip IPv4,
|
||||
request String,
|
||||
status_code UInt16,
|
||||
object_size UInt64
|
||||
)
|
||||
ENGINE = MergeTree()
|
||||
ORDER BY log_time;
|
||||
|
||||
|
||||
CREATE TABLE mgbench.logs3 (
|
||||
log_time DateTime64,
|
||||
device_id FixedString(15),
|
||||
device_name LowCardinality(String),
|
||||
device_type LowCardinality(String),
|
||||
device_floor UInt8,
|
||||
event_type LowCardinality(String),
|
||||
event_unit FixedString(1),
|
||||
event_value Nullable(Float32)
|
||||
)
|
||||
ENGINE = MergeTree()
|
||||
ORDER BY (event_type, log_time);
|
||||
```
|
||||
|
||||
Вставка данных:
|
||||
|
||||
```
|
||||
clickhouse-client --query "INSERT INTO mgbench.logs1 FORMAT CSVWithNames" < mgbench1.csv
|
||||
clickhouse-client --query "INSERT INTO mgbench.logs2 FORMAT CSVWithNames" < mgbench2.csv
|
||||
clickhouse-client --query "INSERT INTO mgbench.logs3 FORMAT CSVWithNames" < mgbench3.csv
|
||||
```
|
||||
|
||||
Запуск тестов производительности:
|
||||
```
|
||||
-- Q1.1: What is the CPU/network utilization for each web server since midnight?
|
||||
|
||||
SELECT machine_name,
|
||||
MIN(cpu) AS cpu_min,
|
||||
MAX(cpu) AS cpu_max,
|
||||
AVG(cpu) AS cpu_avg,
|
||||
MIN(net_in) AS net_in_min,
|
||||
MAX(net_in) AS net_in_max,
|
||||
AVG(net_in) AS net_in_avg,
|
||||
MIN(net_out) AS net_out_min,
|
||||
MAX(net_out) AS net_out_max,
|
||||
AVG(net_out) AS net_out_avg
|
||||
FROM (
|
||||
SELECT machine_name,
|
||||
COALESCE(cpu_user, 0.0) AS cpu,
|
||||
COALESCE(bytes_in, 0.0) AS net_in,
|
||||
COALESCE(bytes_out, 0.0) AS net_out
|
||||
FROM logs1
|
||||
WHERE machine_name IN ('anansi','aragog','urd')
|
||||
AND log_time >= TIMESTAMP '2017-01-11 00:00:00'
|
||||
) AS r
|
||||
GROUP BY machine_name;
|
||||
|
||||
|
||||
-- Q1.2: Which computer lab machines have been offline in the past day?
|
||||
|
||||
SELECT machine_name,
|
||||
log_time
|
||||
FROM logs1
|
||||
WHERE (machine_name LIKE 'cslab%' OR
|
||||
machine_name LIKE 'mslab%')
|
||||
AND load_one IS NULL
|
||||
AND log_time >= TIMESTAMP '2017-01-10 00:00:00'
|
||||
ORDER BY machine_name,
|
||||
log_time;
|
||||
|
||||
|
||||
-- Q1.3: What are the hourly average metrics during the past 10 days for a specific workstation?
|
||||
|
||||
SELECT dt,
|
||||
hr,
|
||||
AVG(load_fifteen) AS load_fifteen_avg,
|
||||
AVG(load_five) AS load_five_avg,
|
||||
AVG(load_one) AS load_one_avg,
|
||||
AVG(mem_free) AS mem_free_avg,
|
||||
AVG(swap_free) AS swap_free_avg
|
||||
FROM (
|
||||
SELECT CAST(log_time AS DATE) AS dt,
|
||||
EXTRACT(HOUR FROM log_time) AS hr,
|
||||
load_fifteen,
|
||||
load_five,
|
||||
load_one,
|
||||
mem_free,
|
||||
swap_free
|
||||
FROM logs1
|
||||
WHERE machine_name = 'babbage'
|
||||
AND load_fifteen IS NOT NULL
|
||||
AND load_five IS NOT NULL
|
||||
AND load_one IS NOT NULL
|
||||
AND mem_free IS NOT NULL
|
||||
AND swap_free IS NOT NULL
|
||||
AND log_time >= TIMESTAMP '2017-01-01 00:00:00'
|
||||
) AS r
|
||||
GROUP BY dt,
|
||||
hr
|
||||
ORDER BY dt,
|
||||
hr;
|
||||
|
||||
|
||||
-- Q1.4: Over 1 month, how often was each server blocked on disk I/O?
|
||||
|
||||
SELECT machine_name,
|
||||
COUNT(*) AS spikes
|
||||
FROM logs1
|
||||
WHERE machine_group = 'Servers'
|
||||
AND cpu_wio > 0.99
|
||||
AND log_time >= TIMESTAMP '2016-12-01 00:00:00'
|
||||
AND log_time < TIMESTAMP '2017-01-01 00:00:00'
|
||||
GROUP BY machine_name
|
||||
ORDER BY spikes DESC
|
||||
LIMIT 10;
|
||||
|
||||
|
||||
-- Q1.5: Which externally reachable VMs have run low on memory?
|
||||
|
||||
SELECT machine_name,
|
||||
dt,
|
||||
MIN(mem_free) AS mem_free_min
|
||||
FROM (
|
||||
SELECT machine_name,
|
||||
CAST(log_time AS DATE) AS dt,
|
||||
mem_free
|
||||
FROM logs1
|
||||
WHERE machine_group = 'DMZ'
|
||||
AND mem_free IS NOT NULL
|
||||
) AS r
|
||||
GROUP BY machine_name,
|
||||
dt
|
||||
HAVING MIN(mem_free) < 10000
|
||||
ORDER BY machine_name,
|
||||
dt;
|
||||
|
||||
|
||||
-- Q1.6: What is the total hourly network traffic across all file servers?
|
||||
|
||||
SELECT dt,
|
||||
hr,
|
||||
SUM(net_in) AS net_in_sum,
|
||||
SUM(net_out) AS net_out_sum,
|
||||
SUM(net_in) + SUM(net_out) AS both_sum
|
||||
FROM (
|
||||
SELECT CAST(log_time AS DATE) AS dt,
|
||||
EXTRACT(HOUR FROM log_time) AS hr,
|
||||
COALESCE(bytes_in, 0.0) / 1000000000.0 AS net_in,
|
||||
COALESCE(bytes_out, 0.0) / 1000000000.0 AS net_out
|
||||
FROM logs1
|
||||
WHERE machine_name IN ('allsorts','andes','bigred','blackjack','bonbon',
|
||||
'cadbury','chiclets','cotton','crows','dove','fireball','hearts','huey',
|
||||
'lindt','milkduds','milkyway','mnm','necco','nerds','orbit','peeps',
|
||||
'poprocks','razzles','runts','smarties','smuggler','spree','stride',
|
||||
'tootsie','trident','wrigley','york')
|
||||
) AS r
|
||||
GROUP BY dt,
|
||||
hr
|
||||
ORDER BY both_sum DESC
|
||||
LIMIT 10;
|
||||
|
||||
|
||||
-- Q2.1: Which requests have caused server errors within the past 2 weeks?
|
||||
|
||||
SELECT *
|
||||
FROM logs2
|
||||
WHERE status_code >= 500
|
||||
AND log_time >= TIMESTAMP '2012-12-18 00:00:00'
|
||||
ORDER BY log_time;
|
||||
|
||||
|
||||
-- Q2.2: During a specific 2-week period, was the user password file leaked?
|
||||
|
||||
SELECT *
|
||||
FROM logs2
|
||||
WHERE status_code >= 200
|
||||
AND status_code < 300
|
||||
AND request LIKE '%/etc/passwd%'
|
||||
AND log_time >= TIMESTAMP '2012-05-06 00:00:00'
|
||||
AND log_time < TIMESTAMP '2012-05-20 00:00:00';
|
||||
|
||||
|
||||
-- Q2.3: What was the average path depth for top-level requests in the past month?
|
||||
|
||||
SELECT top_level,
|
||||
AVG(LENGTH(request) - LENGTH(REPLACE(request, '/', ''))) AS depth_avg
|
||||
FROM (
|
||||
SELECT SUBSTRING(request FROM 1 FOR len) AS top_level,
|
||||
request
|
||||
FROM (
|
||||
SELECT POSITION(SUBSTRING(request FROM 2), '/') AS len,
|
||||
request
|
||||
FROM logs2
|
||||
WHERE status_code >= 200
|
||||
AND status_code < 300
|
||||
AND log_time >= TIMESTAMP '2012-12-01 00:00:00'
|
||||
) AS r
|
||||
WHERE len > 0
|
||||
) AS s
|
||||
WHERE top_level IN ('/about','/courses','/degrees','/events',
|
||||
'/grad','/industry','/news','/people',
|
||||
'/publications','/research','/teaching','/ugrad')
|
||||
GROUP BY top_level
|
||||
ORDER BY top_level;
|
||||
|
||||
|
||||
-- Q2.4: During the last 3 months, which clients have made an excessive number of requests?
|
||||
|
||||
SELECT client_ip,
|
||||
COUNT(*) AS num_requests
|
||||
FROM logs2
|
||||
WHERE log_time >= TIMESTAMP '2012-10-01 00:00:00'
|
||||
GROUP BY client_ip
|
||||
HAVING COUNT(*) >= 100000
|
||||
ORDER BY num_requests DESC;
|
||||
|
||||
|
||||
-- Q2.5: What are the daily unique visitors?
|
||||
|
||||
SELECT dt,
|
||||
COUNT(DISTINCT client_ip)
|
||||
FROM (
|
||||
SELECT CAST(log_time AS DATE) AS dt,
|
||||
client_ip
|
||||
FROM logs2
|
||||
) AS r
|
||||
GROUP BY dt
|
||||
ORDER BY dt;
|
||||
|
||||
|
||||
-- Q2.6: What are the average and maximum data transfer rates (Gbps)?
|
||||
|
||||
SELECT AVG(transfer) / 125000000.0 AS transfer_avg,
|
||||
MAX(transfer) / 125000000.0 AS transfer_max
|
||||
FROM (
|
||||
SELECT log_time,
|
||||
SUM(object_size) AS transfer
|
||||
FROM logs2
|
||||
GROUP BY log_time
|
||||
) AS r;
|
||||
|
||||
|
||||
-- Q3.1: Did the indoor temperature reach freezing over the weekend?
|
||||
|
||||
SELECT *
|
||||
FROM logs3
|
||||
WHERE event_type = 'temperature'
|
||||
AND event_value <= 32.0
|
||||
AND log_time >= '2019-11-29 17:00:00.000';
|
||||
|
||||
|
||||
-- Q3.4: Over the past 6 months, how frequently were each door opened?
|
||||
|
||||
SELECT device_name,
|
||||
device_floor,
|
||||
COUNT(*) AS ct
|
||||
FROM logs3
|
||||
WHERE event_type = 'door_open'
|
||||
AND log_time >= '2019-06-01 00:00:00.000'
|
||||
GROUP BY device_name,
|
||||
device_floor
|
||||
ORDER BY ct DESC;
|
||||
|
||||
|
||||
-- Q3.5: Where in the building do large temperature variations occur in winter and summer?
|
||||
|
||||
WITH temperature AS (
|
||||
SELECT dt,
|
||||
device_name,
|
||||
device_type,
|
||||
device_floor
|
||||
FROM (
|
||||
SELECT dt,
|
||||
hr,
|
||||
device_name,
|
||||
device_type,
|
||||
device_floor,
|
||||
AVG(event_value) AS temperature_hourly_avg
|
||||
FROM (
|
||||
SELECT CAST(log_time AS DATE) AS dt,
|
||||
EXTRACT(HOUR FROM log_time) AS hr,
|
||||
device_name,
|
||||
device_type,
|
||||
device_floor,
|
||||
event_value
|
||||
FROM logs3
|
||||
WHERE event_type = 'temperature'
|
||||
) AS r
|
||||
GROUP BY dt,
|
||||
hr,
|
||||
device_name,
|
||||
device_type,
|
||||
device_floor
|
||||
) AS s
|
||||
GROUP BY dt,
|
||||
device_name,
|
||||
device_type,
|
||||
device_floor
|
||||
HAVING MAX(temperature_hourly_avg) - MIN(temperature_hourly_avg) >= 25.0
|
||||
)
|
||||
SELECT DISTINCT device_name,
|
||||
device_type,
|
||||
device_floor,
|
||||
'WINTER'
|
||||
FROM temperature
|
||||
WHERE dt >= DATE '2018-12-01'
|
||||
AND dt < DATE '2019-03-01'
|
||||
UNION
|
||||
SELECT DISTINCT device_name,
|
||||
device_type,
|
||||
device_floor,
|
||||
'SUMMER'
|
||||
FROM temperature
|
||||
WHERE dt >= DATE '2019-06-01'
|
||||
AND dt < DATE '2019-09-01';
|
||||
|
||||
|
||||
-- Q3.6: For each device category, what are the monthly power consumption metrics?
|
||||
|
||||
SELECT yr,
|
||||
mo,
|
||||
SUM(coffee_hourly_avg) AS coffee_monthly_sum,
|
||||
AVG(coffee_hourly_avg) AS coffee_monthly_avg,
|
||||
SUM(printer_hourly_avg) AS printer_monthly_sum,
|
||||
AVG(printer_hourly_avg) AS printer_monthly_avg,
|
||||
SUM(projector_hourly_avg) AS projector_monthly_sum,
|
||||
AVG(projector_hourly_avg) AS projector_monthly_avg,
|
||||
SUM(vending_hourly_avg) AS vending_monthly_sum,
|
||||
AVG(vending_hourly_avg) AS vending_monthly_avg
|
||||
FROM (
|
||||
SELECT dt,
|
||||
yr,
|
||||
mo,
|
||||
hr,
|
||||
AVG(coffee) AS coffee_hourly_avg,
|
||||
AVG(printer) AS printer_hourly_avg,
|
||||
AVG(projector) AS projector_hourly_avg,
|
||||
AVG(vending) AS vending_hourly_avg
|
||||
FROM (
|
||||
SELECT CAST(log_time AS DATE) AS dt,
|
||||
EXTRACT(YEAR FROM log_time) AS yr,
|
||||
EXTRACT(MONTH FROM log_time) AS mo,
|
||||
EXTRACT(HOUR FROM log_time) AS hr,
|
||||
CASE WHEN device_name LIKE 'coffee%' THEN event_value END AS coffee,
|
||||
CASE WHEN device_name LIKE 'printer%' THEN event_value END AS printer,
|
||||
CASE WHEN device_name LIKE 'projector%' THEN event_value END AS projector,
|
||||
CASE WHEN device_name LIKE 'vending%' THEN event_value END AS vending
|
||||
FROM logs3
|
||||
WHERE device_type = 'meter'
|
||||
) AS r
|
||||
GROUP BY dt,
|
||||
yr,
|
||||
mo,
|
||||
hr
|
||||
) AS s
|
||||
GROUP BY yr,
|
||||
mo
|
||||
ORDER BY yr,
|
||||
mo;
|
||||
```
|
||||
|
||||
Данные также доступны для работы с интерактивными запросами через [Playground](https://gh-api.clickhouse.tech/play?user=play), [пример](https://gh-api.clickhouse.tech/play?user=play#U0VMRUNUIG1hY2hpbmVfbmFtZSwKICAgICAgIE1JTihjcHUpIEFTIGNwdV9taW4sCiAgICAgICBNQVgoY3B1KSBBUyBjcHVfbWF4LAogICAgICAgQVZHKGNwdSkgQVMgY3B1X2F2ZywKICAgICAgIE1JTihuZXRfaW4pIEFTIG5ldF9pbl9taW4sCiAgICAgICBNQVgobmV0X2luKSBBUyBuZXRfaW5fbWF4LAogICAgICAgQVZHKG5ldF9pbikgQVMgbmV0X2luX2F2ZywKICAgICAgIE1JTihuZXRfb3V0KSBBUyBuZXRfb3V0X21pbiwKICAgICAgIE1BWChuZXRfb3V0KSBBUyBuZXRfb3V0X21heCwKICAgICAgIEFWRyhuZXRfb3V0KSBBUyBuZXRfb3V0X2F2ZwpGUk9NICgKICBTRUxFQ1QgbWFjaGluZV9uYW1lLAogICAgICAgICBDT0FMRVNDRShjcHVfdXNlciwgMC4wKSBBUyBjcHUsCiAgICAgICAgIENPQUxFU0NFKGJ5dGVzX2luLCAwLjApIEFTIG5ldF9pbiwKICAgICAgICAgQ09BTEVTQ0UoYnl0ZXNfb3V0LCAwLjApIEFTIG5ldF9vdXQKICBGUk9NIG1nYmVuY2gubG9nczEKICBXSEVSRSBtYWNoaW5lX25hbWUgSU4gKCdhbmFuc2knLCdhcmFnb2cnLCd1cmQnKQogICAgQU5EIGxvZ190aW1lID49IFRJTUVTVEFNUCAnMjAxNy0wMS0xMSAwMDowMDowMCcKKSBBUyByCkdST1VQIEJZIG1hY2hpbmVfbmFtZQ==).
|
||||
|
||||
[Оригинальная статья](https://clickhouse.tech/docs/ru/getting_started/example_datasets/brown-benchmark/) <!--hide-->
|
@ -1355,6 +1355,52 @@ SELECT arrayAvg(x -> (x * x), [2, 4]) AS res;
|
||||
└─────┘
|
||||
```
|
||||
|
||||
**Синтаксис**
|
||||
|
||||
``` sql
|
||||
arraySum(arr)
|
||||
```
|
||||
|
||||
**Возвращаемое значение**
|
||||
|
||||
- Число.
|
||||
|
||||
Тип: [Int](../../sql-reference/data-types/int-uint.md) или [Float](../../sql-reference/data-types/float.md).
|
||||
|
||||
**Параметры**
|
||||
|
||||
- `arr` — [Массив](../../sql-reference/data-types/array.md).
|
||||
|
||||
**Примеры**
|
||||
|
||||
Запрос:
|
||||
|
||||
```sql
|
||||
SELECT arraySum([2,3]) AS res;
|
||||
```
|
||||
|
||||
Результат:
|
||||
|
||||
``` text
|
||||
┌─res─┐
|
||||
│ 5 │
|
||||
└─────┘
|
||||
```
|
||||
|
||||
Запрос:
|
||||
|
||||
``` sql
|
||||
SELECT arraySum(x -> x*x, [2, 3]) AS res;
|
||||
```
|
||||
|
||||
Результат:
|
||||
|
||||
``` text
|
||||
┌─res─┐
|
||||
│ 13 │
|
||||
└─────┘
|
||||
```
|
||||
|
||||
## arrayCumSum(\[func,\] arr1, …) {#arraycumsumfunc-arr1}
|
||||
|
||||
Возвращает массив из частичных сумм элементов исходного массива (сумма с накоплением). Если указана функция `func`, то значения элементов массива преобразуются этой функцией перед суммированием.
|
||||
|
@ -658,6 +658,178 @@ AS parseDateTimeBestEffortUS;
|
||||
└─────────────────────────——┘
|
||||
```
|
||||
|
||||
## parseDateTimeBestEffortUSOrNull {#parsedatetimebesteffortusornull}
|
||||
|
||||
Работает аналогично функции [parseDateTimeBestEffortUS](#parsedatetimebesteffortUS), но в отличие от нее возвращает `NULL`, если входная строка не может быть преобразована в тип данных [DateTime](../../sql-reference/data-types/datetime.md).
|
||||
|
||||
**Синтаксис**
|
||||
|
||||
``` sql
|
||||
parseDateTimeBestEffortUSOrNull(time_string[, time_zone])
|
||||
```
|
||||
|
||||
**Параметры**
|
||||
|
||||
- `time_string` — строка, содержащая дату или дату со временем для преобразования. Дата должна быть в американском формате (`MM/DD/YYYY` и т.д.). [String](../../sql-reference/data-types/string.md).
|
||||
- `time_zone` — [часовой пояс](../../operations/server-configuration-parameters/settings.md#server_configuration_parameters-timezone). Функция анализирует `time_string` в соответствии с заданным часовым поясом. Опциональный параметр. [String](../../sql-reference/data-types/string.md).
|
||||
|
||||
**Поддерживаемые нестандартные форматы**
|
||||
|
||||
- Строка в формате [unix timestamp](https://en.wikipedia.org/wiki/Unix_time), содержащая 9-10 цифр.
|
||||
- Строка, содержащая дату и время: `YYYYMMDDhhmmss`, `MM/DD/YYYY hh:mm:ss`, `MM-DD-YY hh:mm`, `YYYY-MM-DD hh:mm:ss` и т.д.
|
||||
- Строка, содержащая дату без времени: `YYYY`, `YYYYMM`, `YYYY*MM`, `MM/DD/YYYY`, `MM-DD-YY` и т.д.
|
||||
- Строка, содержащая день и время: `DD`, `DD hh`, `DD hh:mm`. В этом случае `YYYY-MM` заменяется на `2000-01`.
|
||||
- Строка, содержащая дату и время, а также информацию о часовом поясе: `YYYY-MM-DD hh:mm:ss ±h:mm` и т.д. Например, `2020-12-12 17:36:00 -5:00`.
|
||||
|
||||
**Возвращаемые значения**
|
||||
|
||||
- `time_string`, преобразованная в тип данных `DateTime`.
|
||||
- `NULL`, если входная строка не может быть преобразована в тип данных `DateTime`.
|
||||
|
||||
**Примеры**
|
||||
|
||||
Запрос:
|
||||
|
||||
``` sql
|
||||
SELECT parseDateTimeBestEffortUSOrNull('02/10/2021 21:12:57') AS parseDateTimeBestEffortUSOrNull;
|
||||
```
|
||||
|
||||
Результат:
|
||||
|
||||
``` text
|
||||
┌─parseDateTimeBestEffortUSOrNull─┐
|
||||
│ 2021-02-10 21:12:57 │
|
||||
└─────────────────────────────────┘
|
||||
```
|
||||
|
||||
Запрос:
|
||||
|
||||
``` sql
|
||||
SELECT parseDateTimeBestEffortUSOrNull('02-10-2021 21:12:57 GMT', 'Europe/Moscow') AS parseDateTimeBestEffortUSOrNull;
|
||||
```
|
||||
|
||||
Результат:
|
||||
|
||||
``` text
|
||||
┌─parseDateTimeBestEffortUSOrNull─┐
|
||||
│ 2021-02-11 00:12:57 │
|
||||
└─────────────────────────────────┘
|
||||
```
|
||||
|
||||
Запрос:
|
||||
|
||||
``` sql
|
||||
SELECT parseDateTimeBestEffortUSOrNull('02.10.2021') AS parseDateTimeBestEffortUSOrNull;
|
||||
```
|
||||
|
||||
Результат:
|
||||
|
||||
``` text
|
||||
┌─parseDateTimeBestEffortUSOrNull─┐
|
||||
│ 2021-02-10 00:00:00 │
|
||||
└─────────────────────────────────┘
|
||||
```
|
||||
|
||||
Запрос:
|
||||
|
||||
``` sql
|
||||
SELECT parseDateTimeBestEffortUSOrNull('10.2021') AS parseDateTimeBestEffortUSOrNull;
|
||||
```
|
||||
|
||||
Результат:
|
||||
|
||||
``` text
|
||||
┌─parseDateTimeBestEffortUSOrNull─┐
|
||||
│ ᴺᵁᴸᴸ │
|
||||
└─────────────────────────────────┘
|
||||
```
|
||||
|
||||
## parseDateTimeBestEffortUSOrZero {#parsedatetimebesteffortusorzero}
|
||||
|
||||
Работает аналогично функции [parseDateTimeBestEffortUS](#parsedatetimebesteffortUS), но в отличие от нее возвращает нулевую дату (`1970-01-01`) или нулевую дату со временем (`1970-01-01 00:00:00`), если входная строка не может быть преобразована в тип данных [DateTime](../../sql-reference/data-types/datetime.md).
|
||||
|
||||
**Синтаксис**
|
||||
|
||||
``` sql
|
||||
parseDateTimeBestEffortUSOrZero(time_string[, time_zone])
|
||||
```
|
||||
|
||||
**Параметры**
|
||||
|
||||
- `time_string` — строка, содержащая дату или дату со временем для преобразования. Дата должна быть в американском формате (`MM/DD/YYYY` и т.д.). [String](../../sql-reference/data-types/string.md).
|
||||
- `time_zone` — [часовой пояс](../../operations/server-configuration-parameters/settings.md#server_configuration_parameters-timezone). Функция анализирует `time_string` в соответствии с заданным часовым поясом. Опциональный параметр. [String](../../sql-reference/data-types/string.md).
|
||||
|
||||
**Поддерживаемые нестандартные форматы**
|
||||
|
||||
- Строка в формате [unix timestamp](https://en.wikipedia.org/wiki/Unix_time), содержащая 9-10 цифр.
|
||||
- Строка, содержащая дату и время: `YYYYMMDDhhmmss`, `MM/DD/YYYY hh:mm:ss`, `MM-DD-YY hh:mm`, `YYYY-MM-DD hh:mm:ss` и т.д.
|
||||
- Строка, содержащая дату без времени: `YYYY`, `YYYYMM`, `YYYY*MM`, `MM/DD/YYYY`, `MM-DD-YY` и т.д.
|
||||
- Строка, содержащая день и время: `DD`, `DD hh`, `DD hh:mm`. В этом случае `YYYY-MM` заменяется на `2000-01`.
|
||||
- Строка, содержащая дату и время, а также информацию о часовом поясе: `YYYY-MM-DD hh:mm:ss ±h:mm` и т.д. Например, `2020-12-12 17:36:00 -5:00`.
|
||||
|
||||
**Возвращаемые значения**
|
||||
|
||||
- `time_string`, преобразованная в тип данных `DateTime`.
|
||||
- Нулевая дата или нулевая дата со временем, если входная строка не может быть преобразована в тип данных `DateTime`.
|
||||
|
||||
**Примеры**
|
||||
|
||||
Запрос:
|
||||
|
||||
``` sql
|
||||
SELECT parseDateTimeBestEffortUSOrZero('02/10/2021 21:12:57') AS parseDateTimeBestEffortUSOrZero;
|
||||
```
|
||||
|
||||
Результат:
|
||||
|
||||
``` text
|
||||
┌─parseDateTimeBestEffortUSOrZero─┐
|
||||
│ 2021-02-10 21:12:57 │
|
||||
└─────────────────────────────────┘
|
||||
```
|
||||
|
||||
Запрос:
|
||||
|
||||
``` sql
|
||||
SELECT parseDateTimeBestEffortUSOrZero('02-10-2021 21:12:57 GMT', 'Europe/Moscow') AS parseDateTimeBestEffortUSOrZero;
|
||||
```
|
||||
|
||||
Результат:
|
||||
|
||||
``` text
|
||||
┌─parseDateTimeBestEffortUSOrZero─┐
|
||||
│ 2021-02-11 00:12:57 │
|
||||
└─────────────────────────────────┘
|
||||
```
|
||||
|
||||
Запрос:
|
||||
|
||||
``` sql
|
||||
SELECT parseDateTimeBestEffortUSOrZero('02.10.2021') AS parseDateTimeBestEffortUSOrZero;
|
||||
```
|
||||
|
||||
Результат:
|
||||
|
||||
``` text
|
||||
┌─parseDateTimeBestEffortUSOrZero─┐
|
||||
│ 2021-02-10 00:00:00 │
|
||||
└─────────────────────────────────┘
|
||||
```
|
||||
|
||||
Запрос:
|
||||
|
||||
``` sql
|
||||
SELECT parseDateTimeBestEffortUSOrZero('02.2021') AS parseDateTimeBestEffortUSOrZero;
|
||||
```
|
||||
|
||||
Результат:
|
||||
|
||||
``` text
|
||||
┌─parseDateTimeBestEffortUSOrZero─┐
|
||||
│ 1970-01-01 00:00:00 │
|
||||
└─────────────────────────────────┘
|
||||
```
|
||||
|
||||
## toUnixTimestamp64Milli
|
||||
## toUnixTimestamp64Micro
|
||||
## toUnixTimestamp64Nano
|
||||
|
@ -7,6 +7,8 @@ toc_title: mysql
|
||||
|
||||
Позволяет выполнять запросы `SELECT` над данными, хранящимися на удалённом MySQL сервере.
|
||||
|
||||
**Синтаксис**
|
||||
|
||||
``` sql
|
||||
mysql('host:port', 'database', 'table', 'user', 'password'[, replace_query, 'on_duplicate_clause']);
|
||||
```
|
||||
@ -23,13 +25,13 @@ mysql('host:port', 'database', 'table', 'user', 'password'[, replace_query, 'on_
|
||||
|
||||
- `password` — пароль пользователя.
|
||||
|
||||
- `replace_query` — флаг, отвечающий за преобразование запросов `INSERT INTO` в `REPLACE INTO`. Если `replace_query=1`, то запрос заменяется.
|
||||
- `replace_query` — флаг, отвечающий за преобразование запросов `INSERT INTO` в `REPLACE INTO`. Возможные значения:
|
||||
- `0` - выполняется запрос `INSERT INTO`.
|
||||
- `1` - выполняется запрос `REPLACE INTO`.
|
||||
|
||||
- `on_duplicate_clause` — выражение `ON DUPLICATE KEY on_duplicate_clause`, добавляемое в запрос `INSERT`.
|
||||
- `on_duplicate_clause` — выражение `ON DUPLICATE KEY on_duplicate_clause`, добавляемое в запрос `INSERT`. Может быть передано только с помощью `replace_query = 0` (если вы одновременно передадите `replace_query = 1` и `on_duplicate_clause`, будет сгенерировано исключение).
|
||||
|
||||
Пример: `INSERT INTO t (c1,c2) VALUES ('a', 2) ON DUPLICATE KEY UPDATE c2 = c2 + 1`, где `on_duplicate_clause` это `UPDATE c2 = c2 + 1`. Чтобы узнать какие `on_duplicate_clause` можно использовать с секцией `ON DUPLICATE KEY` обратитесь к документации MySQL.
|
||||
|
||||
Чтобы указать `'on_duplicate_clause'` необходимо передать `0` в параметр `replace_query`. Если одновременно передать `replace_query = 1` и `'on_duplicate_clause'`, то ClickHouse сгенерирует исключение.
|
||||
Пример: `INSERT INTO t (c1,c2) VALUES ('a', 2) ON DUPLICATE KEY UPDATE c2 = c2 + 1`, где `on_duplicate_clause` это `UPDATE c2 = c2 + 1;`
|
||||
|
||||
Простые условия `WHERE` такие как `=, !=, >, >=, <, =` выполняются на стороне сервера MySQL.
|
||||
|
||||
@ -39,46 +41,59 @@ mysql('host:port', 'database', 'table', 'user', 'password'[, replace_query, 'on_
|
||||
|
||||
Объект таблицы с теми же столбцами, что и в исходной таблице MySQL.
|
||||
|
||||
## Пример использования {#primer-ispolzovaniia}
|
||||
!!! note "Примечание"
|
||||
Чтобы отличить табличную функцию `mysql (...)` в запросе `INSERT` от имени таблицы со списком имен столбцов, используйте ключевые слова `FUNCTION` или `TABLE FUNCTION`. См. примеры ниже.
|
||||
|
||||
**Примеры**
|
||||
|
||||
Таблица в MySQL:
|
||||
|
||||
``` text
|
||||
mysql> CREATE TABLE `test`.`test` (
|
||||
-> `int_id` INT NOT NULL AUTO_INCREMENT,
|
||||
-> `int_nullable` INT NULL DEFAULT NULL,
|
||||
-> `float` FLOAT NOT NULL,
|
||||
-> `float_nullable` FLOAT NULL DEFAULT NULL,
|
||||
-> PRIMARY KEY (`int_id`));
|
||||
Query OK, 0 rows affected (0,09 sec)
|
||||
|
||||
mysql> insert into test (`int_id`, `float`) VALUES (1,2);
|
||||
Query OK, 1 row affected (0,00 sec)
|
||||
mysql> INSERT INTO test (`int_id`, `float`) VALUES (1,2);
|
||||
|
||||
mysql> select * from test;
|
||||
+--------+--------------+-------+----------------+
|
||||
| int_id | int_nullable | float | float_nullable |
|
||||
+--------+--------------+-------+----------------+
|
||||
| 1 | NULL | 2 | NULL |
|
||||
+--------+--------------+-------+----------------+
|
||||
1 row in set (0,00 sec)
|
||||
mysql> SELECT * FROM test;
|
||||
+--------+-------+
|
||||
| int_id | float |
|
||||
+--------+-------+
|
||||
| 1 | 2 |
|
||||
+--------+-------+
|
||||
```
|
||||
|
||||
Получение данных в ClickHouse:
|
||||
|
||||
``` sql
|
||||
SELECT * FROM mysql('localhost:3306', 'test', 'test', 'bayonet', '123')
|
||||
SELECT * FROM mysql('localhost:3306', 'test', 'test', 'bayonet', '123');
|
||||
```
|
||||
|
||||
``` text
|
||||
┌─int_id─┬─int_nullable─┬─float─┬─float_nullable─┐
|
||||
│ 1 │ ᴺᵁᴸᴸ │ 2 │ ᴺᵁᴸᴸ │
|
||||
└────────┴──────────────┴───────┴────────────────┘
|
||||
┌─int_id─┬─float─┐
|
||||
│ 1 │ 2 │
|
||||
└────────┴───────┘
|
||||
```
|
||||
|
||||
## Смотрите также {#smotrite-takzhe}
|
||||
Замена и вставка:
|
||||
|
||||
```sql
|
||||
INSERT INTO FUNCTION mysql('localhost:3306', 'test', 'test', 'bayonet', '123', 1) (int_id, float) VALUES (1, 3);
|
||||
INSERT INTO TABLE FUNCTION mysql('localhost:3306', 'test', 'test', 'bayonet', '123', 0, 'UPDATE int_id = int_id + 1') (int_id, float) VALUES (1, 4);
|
||||
SELECT * FROM mysql('localhost:3306', 'test', 'test', 'bayonet', '123');
|
||||
```
|
||||
|
||||
``` text
|
||||
┌─int_id─┬─float─┐
|
||||
│ 1 │ 3 │
|
||||
│ 2 │ 4 │
|
||||
└────────┴───────┘
|
||||
```
|
||||
|
||||
**Смотрите также**
|
||||
|
||||
- [Движок таблиц ‘MySQL’](../../sql-reference/table-functions/mysql.md)
|
||||
- [Использование MySQL как источника данных для внешнего словаря](../../sql-reference/table-functions/mysql.md#dicts-external_dicts_dict_sources-mysql)
|
||||
|
||||
[Оригинальная статья](https://clickhouse.tech/docs/ru/query_language/table_functions/mysql/) <!--hide-->
|
||||
[Оригинальная статья](https://clickhouse.tech/docs/ru/sql-reference/table_functions/mysql/) <!--hide-->
|
||||
|
@ -106,6 +106,7 @@ AggregateFunctionPtr AggregateFunctionFactory::getImpl(
|
||||
bool has_null_arguments) const
|
||||
{
|
||||
String name = getAliasToOrName(name_param);
|
||||
bool is_case_insensitive = false;
|
||||
Value found;
|
||||
|
||||
/// Find by exact match.
|
||||
@ -115,7 +116,10 @@ AggregateFunctionPtr AggregateFunctionFactory::getImpl(
|
||||
}
|
||||
|
||||
if (auto jt = case_insensitive_aggregate_functions.find(Poco::toLower(name)); jt != case_insensitive_aggregate_functions.end())
|
||||
{
|
||||
found = jt->second;
|
||||
is_case_insensitive = true;
|
||||
}
|
||||
|
||||
const Context * query_context = nullptr;
|
||||
if (CurrentThread::isInitialized())
|
||||
@ -126,7 +130,8 @@ AggregateFunctionPtr AggregateFunctionFactory::getImpl(
|
||||
out_properties = found.properties;
|
||||
|
||||
if (query_context && query_context->getSettingsRef().log_queries)
|
||||
query_context->addQueryFactoriesInfo(Context::QueryLogFactories::AggregateFunction, name);
|
||||
query_context->addQueryFactoriesInfo(
|
||||
Context::QueryLogFactories::AggregateFunction, is_case_insensitive ? Poco::toLower(name) : name);
|
||||
|
||||
/// The case when aggregate function should return NULL on NULL arguments. This case is handled in "get" method.
|
||||
if (!out_properties.returns_default_when_only_null && has_null_arguments)
|
||||
|
@ -56,7 +56,7 @@ class ReservoirSamplerDeterministic
|
||||
{
|
||||
bool good(const UInt32 hash)
|
||||
{
|
||||
return hash == ((hash >> skip_degree) << skip_degree);
|
||||
return !(hash & skip_mask);
|
||||
}
|
||||
|
||||
public:
|
||||
@ -135,11 +135,8 @@ public:
|
||||
throw Poco::Exception("Cannot merge ReservoirSamplerDeterministic's with different max sample size");
|
||||
sorted = false;
|
||||
|
||||
if (b.skip_degree > skip_degree)
|
||||
{
|
||||
skip_degree = b.skip_degree;
|
||||
thinOut();
|
||||
}
|
||||
if (skip_degree < b.skip_degree)
|
||||
setSkipDegree(b.skip_degree);
|
||||
|
||||
for (const auto & sample : b.samples)
|
||||
if (good(sample.second))
|
||||
@ -184,22 +181,39 @@ private:
|
||||
size_t total_values = 0; /// How many values were inserted (regardless if they remain in sample or not).
|
||||
bool sorted = false;
|
||||
Array samples;
|
||||
UInt8 skip_degree = 0; /// The number N determining that we save only one per 2^N elements in average.
|
||||
|
||||
/// The number N determining that we store only one per 2^N elements in average.
|
||||
UInt8 skip_degree = 0;
|
||||
|
||||
/// skip_mask is calculated as (2 ^ skip_degree - 1). We store an element only if (hash & skip_mask) == 0.
|
||||
/// For example, if skip_degree==0 then skip_mask==0 means we store each element;
|
||||
/// if skip_degree==1 then skip_mask==0b0001 means we store one per 2 elements in average;
|
||||
/// if skip_degree==4 then skip_mask==0b1111 means we store one per 16 elements in average.
|
||||
UInt32 skip_mask = 0;
|
||||
|
||||
void insertImpl(const T & v, const UInt32 hash)
|
||||
{
|
||||
/// Make a room for plus one element.
|
||||
while (samples.size() >= max_sample_size)
|
||||
{
|
||||
++skip_degree;
|
||||
if (skip_degree > detail::MAX_SKIP_DEGREE)
|
||||
throw DB::Exception{"skip_degree exceeds maximum value", DB::ErrorCodes::MEMORY_LIMIT_EXCEEDED};
|
||||
thinOut();
|
||||
}
|
||||
setSkipDegree(skip_degree + 1);
|
||||
|
||||
samples.emplace_back(v, hash);
|
||||
}
|
||||
|
||||
void setSkipDegree(UInt8 skip_degree_)
|
||||
{
|
||||
if (skip_degree_ == skip_degree)
|
||||
return;
|
||||
if (skip_degree_ > detail::MAX_SKIP_DEGREE)
|
||||
throw DB::Exception{"skip_degree exceeds maximum value", DB::ErrorCodes::MEMORY_LIMIT_EXCEEDED};
|
||||
skip_degree = skip_degree_;
|
||||
if (skip_degree == detail::MAX_SKIP_DEGREE)
|
||||
skip_mask = static_cast<UInt32>(-1);
|
||||
else
|
||||
skip_mask = (1 << skip_degree) - 1;
|
||||
thinOut();
|
||||
}
|
||||
|
||||
void thinOut()
|
||||
{
|
||||
samples.resize(std::distance(samples.begin(),
|
||||
|
@ -474,19 +474,4 @@ ColumnPtr ColumnFixedString::compress() const
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
void ColumnFixedString::alignStringLength(ColumnFixedString::Chars & data, size_t n, size_t old_size)
|
||||
{
|
||||
size_t length = data.size() - old_size;
|
||||
if (length < n)
|
||||
{
|
||||
data.resize_fill(old_size + n);
|
||||
}
|
||||
else if (length > n)
|
||||
{
|
||||
data.resize_assume_reserved(old_size);
|
||||
throw Exception("Too large value for FixedString(" + std::to_string(n) + ")", ErrorCodes::TOO_LARGE_STRING_SIZE);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -184,8 +184,6 @@ public:
|
||||
const Chars & getChars() const { return chars; }
|
||||
|
||||
size_t getN() const { return n; }
|
||||
|
||||
static void alignStringLength(ColumnFixedString::Chars & data, size_t n, size_t old_size);
|
||||
};
|
||||
|
||||
}
|
||||
|
@ -229,7 +229,21 @@ void ColumnMap::protect()
|
||||
|
||||
void ColumnMap::getExtremes(Field & min, Field & max) const
|
||||
{
|
||||
nested->getExtremes(min, max);
|
||||
Field nested_min;
|
||||
Field nested_max;
|
||||
|
||||
nested->getExtremes(nested_min, nested_max);
|
||||
|
||||
/// Convert result Array fields to Map fields because client expect min and max field to have type Map
|
||||
|
||||
Array nested_min_value = nested_min.get<Array>();
|
||||
Array nested_max_value = nested_max.get<Array>();
|
||||
|
||||
Map map_min_value(nested_min_value.begin(), nested_min_value.end());
|
||||
Map map_max_value(nested_max_value.begin(), nested_max_value.end());
|
||||
|
||||
min = std::move(map_min_value);
|
||||
max = std::move(map_max_value);
|
||||
}
|
||||
|
||||
void ColumnMap::forEachSubcolumn(ColumnCallback callback)
|
||||
|
@ -37,8 +37,12 @@ public:
|
||||
|
||||
static constexpr size_t capacity =
|
||||
#ifndef NDEBUG
|
||||
/* The stacks are normally larger in debug version due to less inlining. */
|
||||
64
|
||||
/* The stacks are normally larger in debug version due to less inlining.
|
||||
*
|
||||
* NOTE: it cannot be larger then 56 right now, since otherwise it will
|
||||
* not fit into minimal PIPE_BUF (512) in TraceCollector.
|
||||
*/
|
||||
56
|
||||
#else
|
||||
32
|
||||
#endif
|
||||
|
@ -22,7 +22,9 @@ namespace
|
||||
{
|
||||
/// Normally query_id is a UUID (string with a fixed length) but user can provide custom query_id.
|
||||
/// Thus upper bound on query_id length should be introduced to avoid buffer overflow in signal handler.
|
||||
constexpr size_t QUERY_ID_MAX_LEN = 1024;
|
||||
///
|
||||
/// And it cannot be large, since otherwise it will not fit into PIPE_BUF.
|
||||
constexpr size_t QUERY_ID_MAX_LEN = sizeof("00000000-0000-0000-0000-000000000000") - 1; // 36
|
||||
}
|
||||
|
||||
LazyPipeFDs pipe;
|
||||
@ -60,10 +62,14 @@ void TraceCollector::collect(TraceType trace_type, const StackTrace & stack_trac
|
||||
8 * sizeof(char) + // maximum VarUInt length for string size
|
||||
QUERY_ID_MAX_LEN * sizeof(char) + // maximum query_id length
|
||||
sizeof(UInt8) + // number of stack frames
|
||||
sizeof(StackTrace::Frames) + // collected stack trace, maximum capacity
|
||||
sizeof(StackTrace::FramePointers) + // collected stack trace, maximum capacity
|
||||
sizeof(TraceType) + // trace type
|
||||
sizeof(UInt64) + // thread_id
|
||||
sizeof(Int64); // size
|
||||
/// Write should be atomic to avoid overlaps
|
||||
/// (since recursive collect() is possible)
|
||||
static_assert(buf_size < PIPE_BUF, "Only write of PIPE_BUF to pipe is atomic");
|
||||
|
||||
char buffer[buf_size];
|
||||
WriteBufferFromFileDescriptorDiscardOnFailure out(pipe.fds_rw[1], buf_size, buffer);
|
||||
|
||||
|
@ -84,16 +84,7 @@ DataTypePtr DataTypeFactory::get(const String & family_name_param, const ASTPtr
|
||||
return get("LowCardinality", low_cardinality_params);
|
||||
}
|
||||
|
||||
DataTypePtr res = findCreatorByName(family_name)(parameters);
|
||||
|
||||
if (CurrentThread::isInitialized())
|
||||
{
|
||||
const auto * query_context = CurrentThread::get().getQueryContext();
|
||||
if (query_context && query_context->getSettingsRef().log_queries)
|
||||
query_context->addQueryFactoriesInfo(Context::QueryLogFactories::DataType, family_name);
|
||||
}
|
||||
|
||||
return res;
|
||||
return findCreatorByName(family_name)(parameters);
|
||||
}
|
||||
|
||||
DataTypePtr DataTypeFactory::getCustom(DataTypeCustomDescPtr customization) const
|
||||
@ -165,19 +156,31 @@ void DataTypeFactory::registerSimpleDataTypeCustom(const String &name, SimpleCre
|
||||
|
||||
const DataTypeFactory::Value & DataTypeFactory::findCreatorByName(const String & family_name) const
|
||||
{
|
||||
const Context * query_context = nullptr;
|
||||
if (CurrentThread::isInitialized())
|
||||
query_context = CurrentThread::get().getQueryContext();
|
||||
|
||||
{
|
||||
DataTypesDictionary::const_iterator it = data_types.find(family_name);
|
||||
if (data_types.end() != it)
|
||||
{
|
||||
if (query_context && query_context->getSettingsRef().log_queries)
|
||||
query_context->addQueryFactoriesInfo(Context::QueryLogFactories::DataType, family_name);
|
||||
return it->second;
|
||||
}
|
||||
}
|
||||
|
||||
String family_name_lowercase = Poco::toLower(family_name);
|
||||
|
||||
{
|
||||
DataTypesDictionary::const_iterator it = case_insensitive_data_types.find(family_name_lowercase);
|
||||
if (case_insensitive_data_types.end() != it)
|
||||
{
|
||||
if (query_context && query_context->getSettingsRef().log_queries)
|
||||
query_context->addQueryFactoriesInfo(Context::QueryLogFactories::DataType, family_name_lowercase);
|
||||
return it->second;
|
||||
}
|
||||
}
|
||||
|
||||
auto hints = this->getHints(family_name);
|
||||
if (!hints.empty())
|
||||
|
@ -25,6 +25,7 @@ namespace ErrorCodes
|
||||
extern const int CANNOT_READ_ALL_DATA;
|
||||
extern const int NUMBER_OF_ARGUMENTS_DOESNT_MATCH;
|
||||
extern const int UNEXPECTED_AST_STRUCTURE;
|
||||
extern const int TOO_LARGE_STRING_SIZE;
|
||||
}
|
||||
|
||||
|
||||
@ -120,12 +121,20 @@ void DataTypeFixedString::serializeTextEscaped(const IColumn & column, size_t ro
|
||||
}
|
||||
|
||||
|
||||
static inline void alignStringLength(const DataTypeFixedString & type,
|
||||
ColumnFixedString::Chars & data,
|
||||
size_t string_start)
|
||||
void DataTypeFixedString::alignStringLength(PaddedPODArray<UInt8> & chars, size_t old_size) const
|
||||
{
|
||||
ColumnFixedString::alignStringLength(data, type.getN(), string_start);
|
||||
size_t length = chars.size() - old_size;
|
||||
if (length < n)
|
||||
{
|
||||
chars.resize_fill(old_size + n);
|
||||
}
|
||||
else if (length > n)
|
||||
{
|
||||
chars.resize_assume_reserved(old_size);
|
||||
throw Exception("Too large value for FixedString(" + std::to_string(n) + ")", ErrorCodes::TOO_LARGE_STRING_SIZE);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
template <typename Reader>
|
||||
static inline void read(const DataTypeFixedString & self, IColumn & column, Reader && reader)
|
||||
@ -135,7 +144,7 @@ static inline void read(const DataTypeFixedString & self, IColumn & column, Read
|
||||
try
|
||||
{
|
||||
reader(data);
|
||||
alignStringLength(self, data, prev_size);
|
||||
self.alignStringLength(data, prev_size);
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
|
@ -1,6 +1,7 @@
|
||||
#pragma once
|
||||
|
||||
#include <DataTypes/IDataType.h>
|
||||
#include <Common/PODArray_fwd.h>
|
||||
|
||||
#define MAX_FIXEDSTRING_SIZE 0xFFFFFF
|
||||
|
||||
@ -82,6 +83,11 @@ public:
|
||||
bool isCategorial() const override { return true; }
|
||||
bool canBeInsideNullable() const override { return true; }
|
||||
bool canBeInsideLowCardinality() const override { return true; }
|
||||
|
||||
/// Makes sure that the length of a newly inserted string to `chars` is equal to getN().
|
||||
/// If the length is less than getN() the function will add zero characters up to getN().
|
||||
/// If the length is greater than getN() the function will throw an exception.
|
||||
void alignStringLength(PaddedPODArray<UInt8> & chars, size_t old_size) const;
|
||||
};
|
||||
|
||||
}
|
||||
|
@ -138,7 +138,7 @@ void DataTypeTuple::serializeBinary(const IColumn & column, size_t row_num, Writ
|
||||
idx_elem.second->serializeBinary(extractElementColumn(column, idx_elem.first), row_num, ostr);
|
||||
}
|
||||
|
||||
|
||||
/// Function must atomically insert values into tuple column
|
||||
template <typename F>
|
||||
static void addElementSafe(const DataTypes & elems, IColumn & column, F && impl)
|
||||
{
|
||||
@ -151,7 +151,8 @@ static void addElementSafe(const DataTypes & elems, IColumn & column, F && impl)
|
||||
|
||||
// Check that all columns now have the same size.
|
||||
size_t new_size = column.size();
|
||||
for (auto i : ext::range(1, ext::size(elems)))
|
||||
|
||||
for (auto i : ext::range(0, ext::size(elems)))
|
||||
{
|
||||
const auto & element_column = extractElementColumn(column, i);
|
||||
if (element_column.size() != new_size)
|
||||
@ -168,6 +169,7 @@ static void addElementSafe(const DataTypes & elems, IColumn & column, F && impl)
|
||||
for (const auto & i : ext::range(0, ext::size(elems)))
|
||||
{
|
||||
auto & element_column = extractElementColumn(column, i);
|
||||
|
||||
if (element_column.size() > old_size)
|
||||
element_column.popBack(1);
|
||||
}
|
||||
@ -215,7 +217,6 @@ void DataTypeTuple::deserializeText(IColumn & column, ReadBuffer & istr, const F
|
||||
}
|
||||
elems[i]->deserializeAsTextQuoted(extractElementColumn(column, i), istr, settings);
|
||||
}
|
||||
});
|
||||
|
||||
// Special format for one element tuple (1,)
|
||||
if (1 == elems.size())
|
||||
@ -224,8 +225,10 @@ void DataTypeTuple::deserializeText(IColumn & column, ReadBuffer & istr, const F
|
||||
// Allow both (1) and (1,)
|
||||
checkChar(',', istr);
|
||||
}
|
||||
|
||||
skipWhitespaceIfAny(istr);
|
||||
assertChar(')', istr);
|
||||
});
|
||||
}
|
||||
|
||||
void DataTypeTuple::serializeTextJSON(const IColumn & column, size_t row_num, WriteBuffer & ostr, const FormatSettings & settings) const
|
||||
@ -290,10 +293,10 @@ void DataTypeTuple::deserializeTextJSON(IColumn & column, ReadBuffer & istr, con
|
||||
auto & element_column = extractElementColumn(column, element_pos);
|
||||
elems[element_pos]->deserializeAsTextJSON(element_column, istr, settings);
|
||||
}
|
||||
});
|
||||
|
||||
skipWhitespaceIfAny(istr);
|
||||
assertChar('}', istr);
|
||||
});
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -312,10 +315,10 @@ void DataTypeTuple::deserializeTextJSON(IColumn & column, ReadBuffer & istr, con
|
||||
}
|
||||
elems[i]->deserializeAsTextJSON(extractElementColumn(column, i), istr, settings);
|
||||
}
|
||||
});
|
||||
|
||||
skipWhitespaceIfAny(istr);
|
||||
assertChar(']', istr);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -54,10 +54,14 @@ static DataTypePtr convertPostgreSQLDataType(std::string & type, bool is_nullabl
|
||||
res = std::make_shared<DataTypeDate>();
|
||||
else if (type.starts_with("numeric"))
|
||||
{
|
||||
/// Numeric and decimal will both end up here as numeric.
|
||||
/// Numeric and decimal will both end up here as numeric. If it has type and precision,
|
||||
/// there will be Numeric(x, y), otherwise just Numeric
|
||||
UInt32 precision, scale;
|
||||
if (type.ends_with(")"))
|
||||
{
|
||||
res = DataTypeFactory::instance().get(type);
|
||||
uint32_t precision = getDecimalPrecision(*res);
|
||||
uint32_t scale = getDecimalScale(*res);
|
||||
precision = getDecimalPrecision(*res);
|
||||
scale = getDecimalScale(*res);
|
||||
|
||||
if (precision <= DecimalUtils::max_precision<Decimal32>)
|
||||
res = std::make_shared<DataTypeDecimal<Decimal32>>(precision, scale);
|
||||
@ -67,6 +71,15 @@ static DataTypePtr convertPostgreSQLDataType(std::string & type, bool is_nullabl
|
||||
res = std::make_shared<DataTypeDecimal<Decimal128>>(precision, scale);
|
||||
else if (precision <= DecimalUtils::max_precision<Decimal256>)
|
||||
res = std::make_shared<DataTypeDecimal<Decimal256>>(precision, scale);
|
||||
else
|
||||
throw Exception(ErrorCodes::BAD_ARGUMENTS, "Precision {} and scale {} are too big and not supported", precision, scale);
|
||||
}
|
||||
else
|
||||
{
|
||||
precision = DecimalUtils::max_precision<Decimal128>;
|
||||
scale = precision / 2;
|
||||
res = std::make_shared<DataTypeDecimal<Decimal128>>(precision, scale);
|
||||
}
|
||||
}
|
||||
|
||||
if (!res)
|
||||
|
@ -525,16 +525,16 @@ namespace
|
||||
{
|
||||
public:
|
||||
using ColumnType = std::conditional_t<is_fixed_string, ColumnFixedString, ColumnString>;
|
||||
using StringDataType = std::conditional_t<is_fixed_string, DataTypeFixedString, DataTypeString>;
|
||||
|
||||
ProtobufSerializerString(
|
||||
const StringDataType & string_data_type_,
|
||||
const std::shared_ptr<const DataTypeFixedString> & fixed_string_data_type_,
|
||||
const google::protobuf::FieldDescriptor & field_descriptor_,
|
||||
const ProtobufReaderOrWriter & reader_or_writer_)
|
||||
: ProtobufSerializerSingleValue(field_descriptor_, reader_or_writer_)
|
||||
, fixed_string_data_type(fixed_string_data_type_)
|
||||
, n(fixed_string_data_type->getN())
|
||||
{
|
||||
static_assert(is_fixed_string, "This constructor for FixedString only");
|
||||
n = string_data_type_.getN();
|
||||
setFunctions();
|
||||
prepareEnumMapping();
|
||||
}
|
||||
@ -583,11 +583,11 @@ namespace
|
||||
{
|
||||
if (row_num < old_size)
|
||||
{
|
||||
ColumnFixedString::alignStringLength(text_buffer, n, 0);
|
||||
fixed_string_data_type->alignStringLength(text_buffer, 0);
|
||||
memcpy(data.data() + row_num * n, text_buffer.data(), n);
|
||||
}
|
||||
else
|
||||
ColumnFixedString::alignStringLength(data, n, old_data_size);
|
||||
fixed_string_data_type->alignStringLength(data, old_data_size);
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -817,7 +817,7 @@ namespace
|
||||
auto str = default_function();
|
||||
arr.insert(str.data(), str.data() + str.size());
|
||||
if constexpr (is_fixed_string)
|
||||
ColumnFixedString::alignStringLength(arr, n, 0);
|
||||
fixed_string_data_type->alignStringLength(arr, 0);
|
||||
default_string = std::move(arr);
|
||||
}
|
||||
return *default_string;
|
||||
@ -865,7 +865,8 @@ namespace
|
||||
str.insert(name.data(), name.data() + name.length());
|
||||
}
|
||||
|
||||
size_t n = 0;
|
||||
const std::shared_ptr<const DataTypeFixedString> fixed_string_data_type;
|
||||
const size_t n = 0;
|
||||
std::function<void(const std::string_view &)> write_function;
|
||||
std::function<void(PaddedPODArray<UInt8> &)> read_function;
|
||||
std::function<String()> default_function;
|
||||
@ -2765,7 +2766,7 @@ namespace
|
||||
case TypeIndex::DateTime: return std::make_unique<ProtobufSerializerDateTime>(field_descriptor, reader_or_writer);
|
||||
case TypeIndex::DateTime64: return std::make_unique<ProtobufSerializerDateTime64>(assert_cast<const DataTypeDateTime64 &>(*data_type), field_descriptor, reader_or_writer);
|
||||
case TypeIndex::String: return std::make_unique<ProtobufSerializerString<false>>(field_descriptor, reader_or_writer);
|
||||
case TypeIndex::FixedString: return std::make_unique<ProtobufSerializerString<true>>(assert_cast<const DataTypeFixedString &>(*data_type), field_descriptor, reader_or_writer);
|
||||
case TypeIndex::FixedString: return std::make_unique<ProtobufSerializerString<true>>(typeid_cast<std::shared_ptr<const DataTypeFixedString>>(data_type), field_descriptor, reader_or_writer);
|
||||
case TypeIndex::Enum8: return std::make_unique<ProtobufSerializerEnum<Int8>>(typeid_cast<std::shared_ptr<const DataTypeEnum8>>(data_type), field_descriptor, reader_or_writer);
|
||||
case TypeIndex::Enum16: return std::make_unique<ProtobufSerializerEnum<Int16>>(typeid_cast<std::shared_ptr<const DataTypeEnum16>>(data_type), field_descriptor, reader_or_writer);
|
||||
case TypeIndex::Decimal32: return std::make_unique<ProtobufSerializerDecimal<Decimal32>>(assert_cast<const DataTypeDecimal<Decimal32> &>(*data_type), field_descriptor, reader_or_writer);
|
||||
@ -2810,12 +2811,7 @@ namespace
|
||||
const auto & array_data_type = assert_cast<const DataTypeArray &>(*data_type);
|
||||
|
||||
if (!allow_repeat)
|
||||
{
|
||||
throw Exception(
|
||||
"The field " + quoteString(field_descriptor.full_name())
|
||||
+ " must be repeated in the protobuf schema to match the column " + backQuote(StringRef{column_name}),
|
||||
ErrorCodes::PROTOBUF_FIELD_NOT_REPEATED);
|
||||
}
|
||||
throwFieldNotRepeated(field_descriptor, column_name);
|
||||
|
||||
auto nested_serializer = buildFieldSerializer(column_name, array_data_type.getNestedType(), field_descriptor,
|
||||
/* allow_repeat = */ false); // We do our repeating now, so for nested type we forget about the repeating.
|
||||
@ -2860,12 +2856,7 @@ namespace
|
||||
|
||||
/// Serialize as a repeated field.
|
||||
if (!allow_repeat && (size_of_tuple > 1))
|
||||
{
|
||||
throw Exception(
|
||||
"The field " + quoteString(field_descriptor.full_name())
|
||||
+ " must be repeated in the protobuf schema to match the column " + backQuote(StringRef{column_name}),
|
||||
ErrorCodes::PROTOBUF_FIELD_NOT_REPEATED);
|
||||
}
|
||||
throwFieldNotRepeated(field_descriptor, column_name);
|
||||
|
||||
std::vector<std::unique_ptr<ProtobufSerializer>> nested_serializers;
|
||||
for (const auto & nested_data_type : tuple_data_type.getElements())
|
||||
@ -2891,6 +2882,21 @@ namespace
|
||||
}
|
||||
}
|
||||
|
||||
[[noreturn]] static void throwFieldNotRepeated(const FieldDescriptor & field_descriptor, const std::string_view & column_name)
|
||||
{
|
||||
if (!field_descriptor.is_repeated())
|
||||
throw Exception(
|
||||
"The field " + quoteString(field_descriptor.full_name())
|
||||
+ " must be repeated in the protobuf schema to match the column " + backQuote(StringRef{column_name}),
|
||||
ErrorCodes::PROTOBUF_FIELD_NOT_REPEATED);
|
||||
|
||||
throw Exception(
|
||||
"The field " + quoteString(field_descriptor.full_name())
|
||||
+ " is repeated but the level of repeatedness is not enough to serialize a multidimensional array from the column "
|
||||
+ backQuote(StringRef{column_name}) + ". It's recommended to make the parent field repeated as well.",
|
||||
ErrorCodes::PROTOBUF_FIELD_NOT_REPEATED);
|
||||
}
|
||||
|
||||
const ProtobufReaderOrWriter reader_or_writer;
|
||||
};
|
||||
}
|
||||
|
@ -99,7 +99,8 @@ FunctionOverloadResolverImplPtr FunctionFactory::tryGetImpl(
|
||||
res = it->second(context);
|
||||
else
|
||||
{
|
||||
it = case_insensitive_functions.find(Poco::toLower(name));
|
||||
name = Poco::toLower(name);
|
||||
it = case_insensitive_functions.find(name);
|
||||
if (case_insensitive_functions.end() != it)
|
||||
res = it->second(context);
|
||||
}
|
||||
|
@ -2586,7 +2586,7 @@ private:
|
||||
WrapperType createTupleToMapWrapper(const DataTypes & from_kv_types, const DataTypes & to_kv_types) const
|
||||
{
|
||||
return [element_wrappers = getElementWrappers(from_kv_types, to_kv_types), from_kv_types, to_kv_types]
|
||||
(ColumnsWithTypeAndName & arguments, const DataTypePtr &, const ColumnNullable * nullable_source, size_t input_rows_count) -> ColumnPtr
|
||||
(ColumnsWithTypeAndName & arguments, const DataTypePtr &, const ColumnNullable * nullable_source, size_t /*input_rows_count*/) -> ColumnPtr
|
||||
{
|
||||
const auto * col = arguments.front().column.get();
|
||||
const auto & column_tuple = assert_cast<const ColumnTuple &>(*col);
|
||||
@ -2597,7 +2597,7 @@ private:
|
||||
{
|
||||
const auto & column_array = assert_cast<const ColumnArray &>(column_tuple.getColumn(i));
|
||||
ColumnsWithTypeAndName element = {{column_array.getDataPtr(), from_kv_types[i], ""}};
|
||||
converted_columns[i] = element_wrappers[i](element, to_kv_types[i], nullable_source, input_rows_count);
|
||||
converted_columns[i] = element_wrappers[i](element, to_kv_types[i], nullable_source, (element[0].column)->size());
|
||||
offsets[i] = column_array.getOffsetsPtr();
|
||||
}
|
||||
|
||||
|
@ -164,7 +164,10 @@ struct ReplaceRegexpImpl
|
||||
size_t size = offsets.size();
|
||||
res_offsets.resize(size);
|
||||
|
||||
re2_st::RE2 searcher(needle);
|
||||
typename re2_st::RE2::Options regexp_options;
|
||||
/// Never write error messages to stderr. It's ignorant to do it from library code.
|
||||
regexp_options.set_log_errors(false);
|
||||
re2_st::RE2 searcher(needle, regexp_options);
|
||||
int num_captures = std::min(searcher.NumberOfCapturingGroups() + 1, static_cast<int>(max_captures));
|
||||
|
||||
Instructions instructions = createInstructions(replacement, num_captures);
|
||||
@ -193,7 +196,10 @@ struct ReplaceRegexpImpl
|
||||
res_data.reserve(data.size());
|
||||
res_offsets.resize(size);
|
||||
|
||||
re2_st::RE2 searcher(needle);
|
||||
typename re2_st::RE2::Options regexp_options;
|
||||
/// Never write error messages to stderr. It's ignorant to do it from library code.
|
||||
regexp_options.set_log_errors(false);
|
||||
re2_st::RE2 searcher(needle, regexp_options);
|
||||
int num_captures = std::min(searcher.NumberOfCapturingGroups() + 1, static_cast<int>(max_captures));
|
||||
|
||||
Instructions instructions = createInstructions(replacement, num_captures);
|
||||
|
@ -1232,8 +1232,8 @@ DataTypePtr HashJoin::joinGetCheckAndGetReturnType(const DataTypes & data_types,
|
||||
{
|
||||
const auto & left_type_origin = data_types[i];
|
||||
const auto & [c2, right_type_origin, right_name] = right_table_keys.safeGetByPosition(i);
|
||||
auto left_type = removeNullable(left_type_origin);
|
||||
auto right_type = removeNullable(right_type_origin);
|
||||
auto left_type = removeNullable(recursiveRemoveLowCardinality(left_type_origin));
|
||||
auto right_type = removeNullable(recursiveRemoveLowCardinality(right_type_origin));
|
||||
if (!left_type->equals(*right_type))
|
||||
throw Exception(
|
||||
"Type mismatch in joinGet key " + toString(i) + ": found type " + left_type->getName() + ", while the needed type is "
|
||||
|
@ -276,6 +276,44 @@ Field convertFieldToTypeImpl(const Field & src, const IDataType & type, const ID
|
||||
return have_unconvertible_element ? Field(Null()) : Field(res);
|
||||
}
|
||||
}
|
||||
else if (const DataTypeMap * type_map = typeid_cast<const DataTypeMap *>(&type))
|
||||
{
|
||||
if (src.getType() == Field::Types::Map)
|
||||
{
|
||||
const auto & key_type = *type_map->getKeyType();
|
||||
const auto & value_type = *type_map->getValueType();
|
||||
|
||||
const auto & map = src.get<Map>();
|
||||
size_t map_size = map.size();
|
||||
|
||||
Map res(map_size);
|
||||
|
||||
bool have_unconvertible_element = false;
|
||||
|
||||
for (size_t i = 0; i < map_size; ++i)
|
||||
{
|
||||
const auto & map_entry = map[i].get<Tuple>();
|
||||
|
||||
const auto & key = map_entry[0];
|
||||
const auto & value = map_entry[1];
|
||||
|
||||
Tuple updated_entry(2);
|
||||
|
||||
updated_entry[0] = convertFieldToType(key, key_type);
|
||||
|
||||
if (updated_entry[0].isNull() && !key_type.isNullable())
|
||||
have_unconvertible_element = true;
|
||||
|
||||
updated_entry[1] = convertFieldToType(value, value_type);
|
||||
if (updated_entry[1].isNull() && !value_type.isNullable())
|
||||
have_unconvertible_element = true;
|
||||
|
||||
res[i] = updated_entry;
|
||||
}
|
||||
|
||||
return have_unconvertible_element ? Field(Null()) : Field(res);
|
||||
}
|
||||
}
|
||||
else if (const DataTypeAggregateFunction * agg_func_type = typeid_cast<const DataTypeAggregateFunction *>(&type))
|
||||
{
|
||||
if (src.getType() != Field::Types::AggregateFunctionState)
|
||||
|
@ -209,6 +209,14 @@ private:
|
||||
if (map.size() % 2)
|
||||
return false;
|
||||
}
|
||||
else if (literal->value.getType() == Field::Types::Tuple)
|
||||
{
|
||||
const Tuple & tuple = literal->value.get<Tuple>();
|
||||
|
||||
for (const auto & value : tuple)
|
||||
if (value.isNull())
|
||||
return true;
|
||||
}
|
||||
|
||||
String column_name = "_dummy_" + std::to_string(replaced_literals.size());
|
||||
replaced_literals.emplace_back(literal, column_name, force_nullable);
|
||||
|
@ -8,10 +8,14 @@
|
||||
#include <Formats/FormatFactory.h>
|
||||
#include <Common/FieldVisitors.h>
|
||||
#include <Core/Block.h>
|
||||
#include <Common/typeid_cast.h>
|
||||
#include <common/find_symbols.h>
|
||||
#include <Common/typeid_cast.h>
|
||||
#include <Common/checkStackSize.h>
|
||||
#include <Parsers/ASTLiteral.h>
|
||||
#include <DataTypes/DataTypeNullable.h>
|
||||
#include <DataTypes/DataTypeTuple.h>
|
||||
#include <DataTypes/DataTypeArray.h>
|
||||
#include <DataTypes/DataTypeMap.h>
|
||||
|
||||
|
||||
namespace DB
|
||||
@ -181,6 +185,87 @@ bool ValuesBlockInputFormat::tryReadValue(IColumn & column, size_t column_idx)
|
||||
}
|
||||
}
|
||||
|
||||
namespace
|
||||
{
|
||||
void tryToReplaceNullFieldsInComplexTypesWithDefaultValues(Field & value, const IDataType & data_type)
|
||||
{
|
||||
checkStackSize();
|
||||
|
||||
WhichDataType type(data_type);
|
||||
|
||||
if (type.isTuple() && value.getType() == Field::Types::Tuple)
|
||||
{
|
||||
const DataTypeTuple & type_tuple = static_cast<const DataTypeTuple &>(data_type);
|
||||
|
||||
Tuple & tuple_value = value.get<Tuple>();
|
||||
|
||||
size_t src_tuple_size = tuple_value.size();
|
||||
size_t dst_tuple_size = type_tuple.getElements().size();
|
||||
|
||||
if (src_tuple_size != dst_tuple_size)
|
||||
throw Exception(fmt::format("Bad size of tuple. Expected size: {}, actual size: {}.",
|
||||
std::to_string(src_tuple_size), std::to_string(dst_tuple_size)), ErrorCodes::TYPE_MISMATCH);
|
||||
|
||||
for (size_t i = 0; i < src_tuple_size; ++i)
|
||||
{
|
||||
const auto & element_type = *(type_tuple.getElements()[i]);
|
||||
|
||||
if (tuple_value[i].isNull() && !element_type.isNullable())
|
||||
tuple_value[i] = element_type.getDefault();
|
||||
|
||||
tryToReplaceNullFieldsInComplexTypesWithDefaultValues(tuple_value[i], element_type);
|
||||
}
|
||||
}
|
||||
else if (type.isArray() && value.getType() == Field::Types::Array)
|
||||
{
|
||||
const DataTypeArray & type_aray = static_cast<const DataTypeArray &>(data_type);
|
||||
const auto & element_type = *(type_aray.getNestedType());
|
||||
|
||||
if (element_type.isNullable())
|
||||
return;
|
||||
|
||||
Array & array_value = value.get<Array>();
|
||||
size_t array_value_size = array_value.size();
|
||||
|
||||
for (size_t i = 0; i < array_value_size; ++i)
|
||||
{
|
||||
if (array_value[i].isNull())
|
||||
array_value[i] = element_type.getDefault();
|
||||
|
||||
tryToReplaceNullFieldsInComplexTypesWithDefaultValues(array_value[i], element_type);
|
||||
}
|
||||
}
|
||||
else if (type.isMap() && value.getType() == Field::Types::Map)
|
||||
{
|
||||
const DataTypeMap & type_map = static_cast<const DataTypeMap &>(data_type);
|
||||
|
||||
const auto & key_type = *type_map.getKeyType();
|
||||
const auto & value_type = *type_map.getValueType();
|
||||
|
||||
auto & map = value.get<Map>();
|
||||
size_t map_size = map.size();
|
||||
|
||||
for (size_t i = 0; i < map_size; ++i)
|
||||
{
|
||||
auto & map_entry = map[i].get<Tuple>();
|
||||
|
||||
auto & entry_key = map_entry[0];
|
||||
auto & entry_value = map_entry[1];
|
||||
|
||||
if (entry_key.isNull() && !key_type.isNullable())
|
||||
entry_key = key_type.getDefault();
|
||||
|
||||
tryToReplaceNullFieldsInComplexTypesWithDefaultValues(entry_key, key_type);
|
||||
|
||||
if (entry_value.isNull() && !value_type.isNullable())
|
||||
entry_value = value_type.getDefault();
|
||||
|
||||
tryToReplaceNullFieldsInComplexTypesWithDefaultValues(entry_value, value_type);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool ValuesBlockInputFormat::parseExpression(IColumn & column, size_t column_idx)
|
||||
{
|
||||
const Block & header = getPort().getHeader();
|
||||
@ -255,9 +340,15 @@ bool ValuesBlockInputFormat::parseExpression(IColumn & column, size_t column_idx
|
||||
bool found_in_cache = false;
|
||||
const auto & result_type = header.getByPosition(column_idx).type;
|
||||
const char * delimiter = (column_idx + 1 == num_columns) ? ")" : ",";
|
||||
auto structure = templates_cache.getFromCacheOrConstruct(result_type, format_settings.null_as_default,
|
||||
TokenIterator(tokens), token_iterator,
|
||||
ast, *context, &found_in_cache, delimiter);
|
||||
auto structure = templates_cache.getFromCacheOrConstruct(
|
||||
result_type,
|
||||
!result_type->isNullable() && format_settings.null_as_default,
|
||||
TokenIterator(tokens),
|
||||
token_iterator,
|
||||
ast,
|
||||
*context,
|
||||
&found_in_cache,
|
||||
delimiter);
|
||||
templates[column_idx].emplace(structure);
|
||||
if (found_in_cache)
|
||||
++attempts_to_deduce_template_cached[column_idx];
|
||||
@ -298,7 +389,13 @@ bool ValuesBlockInputFormat::parseExpression(IColumn & column, size_t column_idx
|
||||
buf.position() = const_cast<char *>(token_iterator->begin);
|
||||
|
||||
std::pair<Field, DataTypePtr> value_raw = evaluateConstantExpression(ast, *context);
|
||||
Field value = convertFieldToType(value_raw.first, type, value_raw.second.get());
|
||||
|
||||
Field & expression_value = value_raw.first;
|
||||
|
||||
if (format_settings.null_as_default)
|
||||
tryToReplaceNullFieldsInComplexTypesWithDefaultValues(expression_value, type);
|
||||
|
||||
Field value = convertFieldToType(expression_value, type, value_raw.second.get());
|
||||
|
||||
/// Check that we are indeed allowed to insert a NULL.
|
||||
if (value.isNull() && !type.isNullable())
|
||||
|
@ -48,7 +48,7 @@ private:
|
||||
SingleExpressionEvaluation
|
||||
};
|
||||
|
||||
typedef std::vector<std::optional<ConstantExpressionTemplate>> ConstantExpressionTemplates;
|
||||
using ConstantExpressionTemplates = std::vector<std::optional<ConstantExpressionTemplate>>;
|
||||
|
||||
Chunk generate() override;
|
||||
|
||||
|
@ -21,6 +21,7 @@
|
||||
#include <Interpreters/PartLog.h>
|
||||
#include <Interpreters/TreeRewriter.h>
|
||||
#include <Interpreters/Context.h>
|
||||
#include <Interpreters/inplaceBlockConversions.h>
|
||||
#include <Parsers/ASTFunction.h>
|
||||
#include <Parsers/ASTLiteral.h>
|
||||
#include <Parsers/ASTNameTypePair.h>
|
||||
@ -1482,6 +1483,7 @@ void MergeTreeData::checkAlterIsPossible(const AlterCommands & commands, const S
|
||||
for (const auto & column : old_metadata.getColumns().getAllPhysical())
|
||||
old_types.emplace(column.name, column.type.get());
|
||||
|
||||
NamesAndTypesList columns_to_check_conversion;
|
||||
for (const AlterCommand & command : commands)
|
||||
{
|
||||
/// Just validate partition expression
|
||||
@ -1571,9 +1573,9 @@ void MergeTreeData::checkAlterIsPossible(const AlterCommands & commands, const S
|
||||
throw Exception("ALTER of key column " + backQuoteIfNeed(command.column_name) + " is forbidden",
|
||||
ErrorCodes::ALTER_OF_COLUMN_IS_FORBIDDEN);
|
||||
|
||||
if (columns_alter_type_check_safe_for_partition.count(command.column_name))
|
||||
{
|
||||
if (command.type == AlterCommand::MODIFY_COLUMN)
|
||||
{
|
||||
if (columns_alter_type_check_safe_for_partition.count(command.column_name))
|
||||
{
|
||||
auto it = old_types.find(command.column_name);
|
||||
|
||||
@ -1584,11 +1586,8 @@ void MergeTreeData::checkAlterIsPossible(const AlterCommands & commands, const S
|
||||
+ " is not safe because it can change the representation of partition key",
|
||||
ErrorCodes::ALTER_OF_COLUMN_IS_FORBIDDEN);
|
||||
}
|
||||
}
|
||||
|
||||
if (columns_alter_type_metadata_only.count(command.column_name))
|
||||
{
|
||||
if (command.type == AlterCommand::MODIFY_COLUMN)
|
||||
{
|
||||
auto it = old_types.find(command.column_name);
|
||||
assert(it != old_types.end());
|
||||
@ -1598,6 +1597,12 @@ void MergeTreeData::checkAlterIsPossible(const AlterCommands & commands, const S
|
||||
+ " is not safe because it can change the representation of primary key",
|
||||
ErrorCodes::ALTER_OF_COLUMN_IS_FORBIDDEN);
|
||||
}
|
||||
|
||||
if (old_metadata.getColumns().has(command.column_name))
|
||||
{
|
||||
columns_to_check_conversion.push_back(
|
||||
new_metadata.getColumns().getPhysical(command.column_name));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1605,6 +1610,12 @@ void MergeTreeData::checkAlterIsPossible(const AlterCommands & commands, const S
|
||||
checkProperties(new_metadata, old_metadata);
|
||||
checkTTLExpressions(new_metadata, old_metadata);
|
||||
|
||||
if (!columns_to_check_conversion.empty())
|
||||
{
|
||||
auto old_header = old_metadata.getSampleBlock();
|
||||
performRequiredConversions(old_header, columns_to_check_conversion, global_context);
|
||||
}
|
||||
|
||||
if (old_metadata.hasSettingsChanges())
|
||||
{
|
||||
const auto current_changes = old_metadata.getSettingsChanges()->as<const ASTSetQuery &>().changes;
|
||||
|
@ -63,13 +63,13 @@ def test_postgres_conversions(started_cluster):
|
||||
cursor.execute(
|
||||
'''CREATE TABLE IF NOT EXISTS test_types (
|
||||
a smallint, b integer, c bigint, d real, e double precision, f serial, g bigserial,
|
||||
h timestamp, i date, j numeric(5, 5), k decimal(5, 5))''')
|
||||
h timestamp, i date, j decimal(5, 3), k numeric)''')
|
||||
node1.query('''
|
||||
INSERT INTO TABLE FUNCTION postgresql('postgres1:5432', 'clickhouse', 'test_types', 'postgres', 'mysecretpassword') VALUES
|
||||
(-32768, -2147483648, -9223372036854775808, 1.12345, 1.1234567890, 2147483647, 9223372036854775807, '2000-05-12 12:12:12', '2000-05-12', 0.2, 0.2)''')
|
||||
(-32768, -2147483648, -9223372036854775808, 1.12345, 1.1234567890, 2147483647, 9223372036854775807, '2000-05-12 12:12:12', '2000-05-12', 22.222, 22.222)''')
|
||||
result = node1.query('''
|
||||
SELECT * FROM postgresql('postgres1:5432', 'clickhouse', 'test_types', 'postgres', 'mysecretpassword')''')
|
||||
assert(result == '-32768\t-2147483648\t-9223372036854775808\t1.12345\t1.123456789\t2147483647\t9223372036854775807\t2000-05-12 12:12:12\t2000-05-12\t0.20000\t0.20000\n')
|
||||
SELECT a, b, c, d, e, f, g, h, i, j, toDecimal128(k, 3) FROM postgresql('postgres1:5432', 'clickhouse', 'test_types', 'postgres', 'mysecretpassword')''')
|
||||
assert(result == '-32768\t-2147483648\t-9223372036854775808\t1.12345\t1.123456789\t2147483647\t9223372036854775807\t2000-05-12 12:12:12\t2000-05-12\t22.222\t22.222\n')
|
||||
|
||||
cursor.execute(
|
||||
'''CREATE TABLE IF NOT EXISTS test_array_dimensions
|
||||
|
@ -1,18 +1,19 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
CURDIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
|
||||
SCHEMADIR=$CURDIR/format_schemas
|
||||
# shellcheck source=../shell_config.sh
|
||||
. "$CURDIR"/../shell_config.sh
|
||||
|
||||
set -eo pipefail
|
||||
|
||||
# Run the client.
|
||||
$CLICKHOUSE_CLIENT --multiquery <<'EOF'
|
||||
$CLICKHOUSE_CLIENT --multiquery <<EOF
|
||||
DROP TABLE IF EXISTS array_3dim_protobuf_00825;
|
||||
|
||||
CREATE TABLE array_3dim_protobuf_00825
|
||||
(
|
||||
`a_b_c` Array(Array(Array(Int32)))
|
||||
a_b_c Array(Array(Array(Int32)))
|
||||
) ENGINE = MergeTree ORDER BY tuple();
|
||||
|
||||
INSERT INTO array_3dim_protobuf_00825 VALUES ([[], [[]], [[1]], [[2,3],[4]]]), ([[[5, 6, 7]], [[8, 9, 10]]]);
|
||||
@ -21,15 +22,16 @@ SELECT * FROM array_3dim_protobuf_00825;
|
||||
EOF
|
||||
|
||||
BINARY_FILE_PATH=$(mktemp "$CURDIR/00825_protobuf_format_array_3dim.XXXXXX.binary")
|
||||
$CLICKHOUSE_CLIENT --query "SELECT * FROM array_3dim_protobuf_00825 FORMAT Protobuf SETTINGS format_schema = '$CURDIR/00825_protobuf_format_array_3dim:ABC'" > "$BINARY_FILE_PATH"
|
||||
$CLICKHOUSE_CLIENT --query "SELECT * FROM array_3dim_protobuf_00825 FORMAT Protobuf SETTINGS format_schema = '$SCHEMADIR/00825_protobuf_format_array_3dim:ABC'" > "$BINARY_FILE_PATH"
|
||||
|
||||
# Check the output in the protobuf format
|
||||
echo
|
||||
$CURDIR/helpers/protobuf_length_delimited_encoder.py --decode_and_check --format_schema "$CURDIR/00825_protobuf_format_array_3dim:ABC" --input "$BINARY_FILE_PATH"
|
||||
$CURDIR/helpers/protobuf_length_delimited_encoder.py --decode_and_check --format_schema "$SCHEMADIR/00825_protobuf_format_array_3dim:ABC" --input "$BINARY_FILE_PATH"
|
||||
|
||||
# Check the input in the protobuf format (now the table contains the same data twice).
|
||||
echo
|
||||
$CLICKHOUSE_CLIENT --query "INSERT INTO array_3dim_protobuf_00825 FORMAT Protobuf SETTINGS format_schema='$CURDIR/00825_protobuf_format_array_3dim:ABC'" < "$BINARY_FILE_PATH"
|
||||
$CLICKHOUSE_CLIENT --query "INSERT INTO array_3dim_protobuf_00825 FORMAT Protobuf SETTINGS format_schema='$SCHEMADIR/00825_protobuf_format_array_3dim:ABC'" < "$BINARY_FILE_PATH"
|
||||
$CLICKHOUSE_CLIENT --query "SELECT * FROM array_3dim_protobuf_00825"
|
||||
|
||||
rm "$BINARY_FILE_PATH"
|
||||
$CLICKHOUSE_CLIENT --query "DROP TABLE array_3dim_protobuf_00825"
|
||||
|
@ -3,18 +3,21 @@
|
||||
# https://github.com/ClickHouse/ClickHouse/issues/9069
|
||||
|
||||
CURDIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
|
||||
SCHEMADIR=$CURDIR/format_schemas
|
||||
# shellcheck source=../shell_config.sh
|
||||
. "$CURDIR"/../shell_config.sh
|
||||
|
||||
set -eo pipefail
|
||||
|
||||
# Run the client.
|
||||
$CLICKHOUSE_CLIENT --multiquery <<'EOF'
|
||||
$CLICKHOUSE_CLIENT --multiquery <<EOF
|
||||
DROP TABLE IF EXISTS array_of_arrays_protobuf_00825;
|
||||
|
||||
CREATE TABLE array_of_arrays_protobuf_00825
|
||||
(
|
||||
`a` String,
|
||||
`b` Nested (
|
||||
`c` Array(Float64)
|
||||
a String,
|
||||
b Nested (
|
||||
c Array(Float64)
|
||||
)
|
||||
) ENGINE = MergeTree ORDER BY tuple();
|
||||
|
||||
@ -24,15 +27,16 @@ SELECT * FROM array_of_arrays_protobuf_00825;
|
||||
EOF
|
||||
|
||||
BINARY_FILE_PATH=$(mktemp "$CURDIR/00825_protobuf_format_array_of_arrays.XXXXXX.binary")
|
||||
$CLICKHOUSE_CLIENT --query "SELECT * FROM array_of_arrays_protobuf_00825 FORMAT Protobuf SETTINGS format_schema = '$CURDIR/00825_protobuf_format_array_of_arrays:AA'" > "$BINARY_FILE_PATH"
|
||||
$CLICKHOUSE_CLIENT --query "SELECT * FROM array_of_arrays_protobuf_00825 FORMAT Protobuf SETTINGS format_schema = '$SCHEMADIR/00825_protobuf_format_array_of_arrays:AA'" > "$BINARY_FILE_PATH"
|
||||
|
||||
# Check the output in the protobuf format
|
||||
echo
|
||||
$CURDIR/helpers/protobuf_length_delimited_encoder.py --decode_and_check --format_schema "$CURDIR/00825_protobuf_format_array_of_arrays:AA" --input "$BINARY_FILE_PATH"
|
||||
$CURDIR/helpers/protobuf_length_delimited_encoder.py --decode_and_check --format_schema "$SCHEMADIR/00825_protobuf_format_array_of_arrays:AA" --input "$BINARY_FILE_PATH"
|
||||
|
||||
# Check the input in the protobuf format (now the table contains the same data twice).
|
||||
echo
|
||||
$CLICKHOUSE_CLIENT --query "INSERT INTO array_of_arrays_protobuf_00825 FORMAT Protobuf SETTINGS format_schema='$CURDIR/00825_protobuf_format_array_of_arrays:AA'" < "$BINARY_FILE_PATH"
|
||||
$CLICKHOUSE_CLIENT --query "INSERT INTO array_of_arrays_protobuf_00825 FORMAT Protobuf SETTINGS format_schema='$SCHEMADIR/00825_protobuf_format_array_of_arrays:AA'" < "$BINARY_FILE_PATH"
|
||||
$CLICKHOUSE_CLIENT --query "SELECT * FROM array_of_arrays_protobuf_00825"
|
||||
|
||||
rm "$BINARY_FILE_PATH"
|
||||
$CLICKHOUSE_CLIENT --query "DROP TABLE array_of_arrays_protobuf_00825"
|
||||
|
@ -3,13 +3,14 @@
|
||||
# https://github.com/ClickHouse/ClickHouse/issues/7438
|
||||
|
||||
CURDIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
|
||||
SCHEMADIR=$CURDIR/format_schemas
|
||||
# shellcheck source=../shell_config.sh
|
||||
. "$CURDIR"/../shell_config.sh
|
||||
|
||||
set -eo pipefail
|
||||
|
||||
# Run the client.
|
||||
$CLICKHOUSE_CLIENT --multiquery <<'EOF'
|
||||
$CLICKHOUSE_CLIENT --multiquery <<EOF
|
||||
DROP TABLE IF EXISTS enum_mapping_protobuf_00825;
|
||||
|
||||
CREATE TABLE enum_mapping_protobuf_00825
|
||||
@ -23,15 +24,16 @@ SELECT * FROM enum_mapping_protobuf_00825;
|
||||
EOF
|
||||
|
||||
BINARY_FILE_PATH=$(mktemp "$CURDIR/00825_protobuf_format_enum_mapping.XXXXXX.binary")
|
||||
$CLICKHOUSE_CLIENT --query "SELECT * FROM enum_mapping_protobuf_00825 FORMAT Protobuf SETTINGS format_schema = '$CURDIR/00825_protobuf_format_enum_mapping:Message'" > "$BINARY_FILE_PATH"
|
||||
$CLICKHOUSE_CLIENT --query "SELECT * FROM enum_mapping_protobuf_00825 FORMAT Protobuf SETTINGS format_schema = '$SCHEMADIR/00825_protobuf_format_enum_mapping:Message'" > "$BINARY_FILE_PATH"
|
||||
|
||||
# Check the output in the protobuf format
|
||||
echo
|
||||
$CURDIR/helpers/protobuf_length_delimited_encoder.py --decode_and_check --format_schema "$CURDIR/00825_protobuf_format_enum_mapping:Message" --input "$BINARY_FILE_PATH"
|
||||
$CURDIR/helpers/protobuf_length_delimited_encoder.py --decode_and_check --format_schema "$SCHEMADIR/00825_protobuf_format_enum_mapping:Message" --input "$BINARY_FILE_PATH"
|
||||
|
||||
# Check the input in the protobuf format (now the table contains the same data twice).
|
||||
echo
|
||||
$CLICKHOUSE_CLIENT --query "INSERT INTO enum_mapping_protobuf_00825 FORMAT Protobuf SETTINGS format_schema='$CURDIR/00825_protobuf_format_enum_mapping:Message'" < "$BINARY_FILE_PATH"
|
||||
$CLICKHOUSE_CLIENT --query "INSERT INTO enum_mapping_protobuf_00825 FORMAT Protobuf SETTINGS format_schema='$SCHEMADIR/00825_protobuf_format_enum_mapping:Message'" < "$BINARY_FILE_PATH"
|
||||
$CLICKHOUSE_CLIENT --query "SELECT * FROM enum_mapping_protobuf_00825"
|
||||
|
||||
rm "$BINARY_FILE_PATH"
|
||||
$CLICKHOUSE_CLIENT --query "DROP TABLE enum_mapping_protobuf_00825"
|
||||
|
@ -1,5 +0,0 @@
|
||||
echo -ne '\xf3\x01\x0a\x24\x61\x37\x35\x32\x32\x31\x35\x38\x2d\x33\x64\x34\x31\x2d\x34\x62\x37\x37\x2d\x61\x64\x36\x39\x2d\x36\x63\x35\x39\x38\x65\x65\x35\x35\x63\x34\x39\x12\x04\x49\x76\x61\x6e\x1a\x06\x50\x65\x74\x72\x6f\x76\x20\x01\x28\xaf\x1f\x32\x03\x70\x6e\x67\x3a\x0c\x2b\x37\x34\x39\x35\x31\x32\x33\x34\x35\x36\x37\x40\x01\x4d\xfc\xd0\x30\x5c\x50\x26\x58\x09\x62\x09\x59\x65\x73\x74\x65\x72\x64\x61\x79\x62\x07\x46\x6c\x6f\x77\x65\x72\x73\x6a\x04\xff\x01\x00\x00\x72\x06\x4d\x6f\x73\x63\x6f\x77\x7a\x08\x4b\x03\x5f\x42\x72\x7d\x16\x42\x81\x01\x1f\x85\xeb\x51\xb8\x1e\x09\x40\x89\x01\x33\x33\x33\x33\x33\xc3\x6a\x40\x95\x01\xcd\xcc\xcc\x3d\x9d\x01\x9a\x99\xb9\x40\xa0\x01\x80\xc4\xd7\x8d\x7f\xaa\x01\x0c\x0a\x05\x6d\x65\x74\x65\x72\x15\x00\x00\x80\x3f\xaa\x01\x11\x0a\x0a\x63\x65\x6e\x74\x69\x6d\x65\x74\x65\x72\x15\x0a\xd7\x23\x3c\xaa\x01\x10\x0a\x09\x6b\x69\x6c\x6f\x6d\x65\x74\x65\x72\x15\x00\x00\x7a\x44\xb2\x01\x10\x0a\x0e\xa2\x06\x0b\x0a\x09\x08\xf4\x03\x12\x04\xf5\x03\xf6\x03\x7e\x0a\x24\x63\x36\x39\x34\x61\x64\x38\x61\x2d\x66\x37\x31\x34\x2d\x34\x65\x61\x33\x2d\x39\x30\x37\x64\x2d\x66\x64\x35\x34\x66\x62\x32\x35\x64\x39\x62\x35\x12\x07\x4e\x61\x74\x61\x6c\x69\x61\x1a\x08\x53\x6f\x6b\x6f\x6c\x6f\x76\x61\x28\xa6\x3f\x32\x03\x6a\x70\x67\x50\x1a\x58\x0b\x6a\x04\x64\xc8\x01\x32\x72\x08\x50\x6c\x79\x6d\x6f\x75\x74\x68\x7a\x08\x6a\x9d\x49\x42\x46\x8c\x84\xc0\x81\x01\x6e\x86\x1b\xf0\xf9\x21\x09\x40\x95\x01\x42\x60\xe5\x3b\x9d\x01\xcd\xcc\xac\x40\xa0\x01\xff\xff\xa9\xce\x93\x8c\x09\xc0\x01\x0a\x24\x61\x37\x64\x61\x31\x61\x61\x36\x2d\x66\x34\x32\x35\x2d\x34\x37\x38\x39\x2d\x38\x39\x34\x37\x2d\x62\x30\x33\x34\x37\x38\x36\x65\x64\x33\x37\x34\x12\x06\x56\x61\x73\x69\x6c\x79\x1a\x07\x53\x69\x64\x6f\x72\x6f\x76\x20\x01\x28\xfb\x48\x32\x03\x62\x6d\x70\x3a\x0d\x2b\x34\x34\x32\x30\x31\x32\x33\x34\x35\x36\x37\x38\x40\x01\x4d\x50\xe0\x27\x5c\x50\x17\x58\x04\x62\x05\x53\x75\x6e\x6e\x79\x6a\x05\xfa\x01\xf4\x01\x0a\x72\x08\x4d\x75\x72\x6d\x61\x6e\x73\x6b\x7a\x08\xfd\xf0\x89\x42\xc8\x4c\x04\x42\x81\x01\x11\x2d\x44\x54\xfb\x21\x09\x40\x89\x01\x00\x00\x00\xe8\x76\x48\x37\x42\x95\x01\x00\x00\x48\x44\x9d\x01\xcd\xcc\x4c\xc0\xa0\x01\x80\xd4\x9f\x93\x01\xaa\x01\x0c\x0a\x05\x70\x6f\x75\x6e\x64\x15\x00\x00\x80\x41\xb2\x01\x0a\x0a\x08\xa2\x06\x05\x0a\x03\x08\xf7\x03' | $CLICKHOUSE_CLIENT --query="INSERT INTO in_persons_00825 FORMAT Protobuf SETTINGS format_schema = '$CURDIR/00825_protobuf_format:Person'"
|
||||
echo -ne '\xb3\x01\x12\x05\x46\x72\x69\x64\x61\x28\x99\xe1\xf3\xd1\x0b\x52\x08\x45\x72\x6d\x61\x6b\x6f\x76\x61\x72\x0c\x00\x00\xdc\x42\x00\x00\x52\x43\x00\x00\x94\x42\x79\x48\xce\x3d\x51\x00\x00\x00\x00\xc8\x02\x14\xc2\x05\x08\x00\x00\x80\x44\x00\x00\x80\x49\x9a\x06\x02\x4b\x42\x9a\x06\x02\x4d\x42\xa1\x06\x00\x00\x00\x00\x00\x00\xe0\x3f\xa8\x06\x2a\xa8\x06\xa8\xff\xff\xff\xff\xff\xff\xff\xff\x01\xb0\x06\x01\xbd\x06\x25\x06\x49\x40\xfa\x06\x02\x34\x30\x90\x08\xe2\x08\xe1\x08\x89\xe6\x6e\xdd\x01\x00\x00\x00\xb0\x09\xc3\x19\xd0\x0c\xb7\x02\xe2\x12\x24\x32\x30\x66\x63\x64\x39\x35\x61\x2d\x33\x33\x32\x64\x2d\x34\x31\x64\x62\x2d\x61\x39\x65\x63\x2d\x31\x36\x31\x66\x36\x34\x34\x64\x30\x35\x39\x63\xa0\x38\xbc\x05\xaa\x38\x02\xbd\x05\xb4\x01\x08\x01\x12\x06\x49\x73\x6f\x6c\x64\x65\x52\x07\x4c\x61\x76\x72\x6f\x76\x61\x72\x0c\x00\x00\x7f\x43\x00\x00\x00\x00\x00\x00\x7f\x43\xaa\x01\x03\x61\x62\x63\xc8\x02\x32\xc2\x05\x08\x00\x00\x00\x41\x00\x00\x80\x3f\x9a\x06\x04\x42\x79\x74\x65\x9a\x06\x03\x42\x69\x74\xa1\x06\x00\x00\x00\x00\x00\x00\x12\x40\xa8\x06\x1a\xa8\x06\xb0\xff\xff\xff\xff\xff\xff\xff\xff\x01\xb0\x06\x01\xbd\x06\xf9\x0f\x49\x40\xc2\x06\x01\x2c\xfa\x06\x02\x33\x32\x90\x08\x78\xe1\x08\x39\x4e\x2b\xfe\xe4\xf5\xff\xff\xb0\x09\xe8\x30\xd8\x12\x01\xe2\x12\x24\x37\x63\x66\x61\x36\x38\x35\x36\x2d\x61\x35\x34\x61\x2d\x34\x37\x38\x36\x2d\x62\x38\x65\x35\x2d\x37\x34\x35\x31\x35\x39\x64\x35\x32\x32\x37\x38\xa0\x38\xbe\x05\xc2\x3e\x05\x15\x00\x00\xb6\x42' | $CLICKHOUSE_CLIENT --query="INSERT INTO in_persons_00825 FORMAT Protobuf SETTINGS format_schema = '$CURDIR/00825_protobuf_format:AltPerson'"
|
||||
echo -ne '\xa5\x02\x0a\x24\x61\x61\x30\x65\x35\x61\x30\x36\x2d\x63\x61\x62\x32\x2d\x34\x30\x33\x34\x2d\x61\x36\x61\x32\x2d\x34\x38\x65\x38\x32\x62\x39\x31\x36\x36\x34\x65\x12\x06\x4c\x65\x6f\x6e\x69\x64\x1a\x08\x4b\x69\x72\x69\x6c\x6c\x6f\x76\x22\x04\x6d\x61\x6c\x65\x2a\x0a\x31\x39\x38\x33\x2d\x30\x36\x2d\x32\x34\x3a\x0c\x2b\x37\x34\x39\x35\x30\x32\x37\x35\x38\x36\x34\x42\x01\x31\x4a\x13\x32\x30\x31\x39\x2d\x30\x32\x2d\x30\x34\x20\x30\x39\x3a\x34\x35\x3a\x30\x30\x52\x02\x33\x35\x5a\x06\x63\x61\x6e\x63\x65\x72\x62\x07\x37\x20\x72\x69\x6e\x67\x73\x62\x08\x45\x61\x73\x74\x73\x69\x64\x65\x62\x0b\x4c\x61\x73\x74\x20\x48\x75\x72\x72\x61\x68\x6a\x01\x30\x6a\x01\x30\x6a\x03\x32\x35\x35\x72\x09\x53\x61\x6e\x20\x44\x69\x65\x67\x6f\x7a\x09\x33\x32\x2e\x38\x32\x33\x39\x34\x33\x7a\x0b\x2d\x31\x31\x37\x2e\x30\x38\x31\x33\x32\x37\x82\x01\x09\x33\x2e\x31\x34\x31\x35\x39\x32\x37\x8a\x01\x08\x31\x35\x30\x30\x30\x30\x30\x30\x92\x01\x06\x31\x38\x36\x2e\x37\x35\x9a\x01\x04\x2d\x32\x2e\x31\xa2\x01\x0b\x32\x30\x36\x35\x39\x38\x32\x39\x33\x33\x31\xaa\x01\x18\x0a\x06\x6d\x69\x6e\x75\x74\x65\x0a\x04\x68\x6f\x75\x72\x12\x02\x36\x30\x12\x04\x33\x36\x30\x30\xb2\x01\x08\x0a\x06\x12\x04\x31\x38\x30\x30' | $CLICKHOUSE_CLIENT --query="INSERT INTO in_persons_00825 FORMAT Protobuf SETTINGS format_schema = '$CURDIR/00825_protobuf_format:StrPerson'"
|
||||
echo -ne '\xdd\x01\x0a\x24\x33\x66\x61\x65\x65\x30\x36\x34\x2d\x63\x34\x66\x37\x2d\x34\x64\x33\x34\x2d\x62\x36\x66\x33\x2d\x38\x64\x38\x31\x63\x32\x62\x36\x61\x31\x35\x64\x12\x04\x4e\x69\x63\x6b\x1a\x0a\x4b\x6f\x6c\x65\x73\x6e\x69\x6b\x6f\x76\x20\x01\x28\xda\x52\x32\x03\x62\x6d\x70\x3a\x0c\x34\x31\x32\x2d\x36\x38\x37\x2d\x35\x30\x30\x37\x40\x01\x4d\x2f\x27\xf2\x5b\x50\x14\x58\x09\x62\x06\x48\x61\x76\x61\x6e\x61\x68\x80\x01\x68\x00\x68\x80\x01\x72\x0a\x50\x69\x74\x74\x73\x62\x75\x72\x67\x68\x7a\x08\x9b\x11\x22\x42\x1f\xe6\x9f\xc2\x81\x01\x28\x2d\x44\x54\xfb\x21\x09\x40\x89\x01\x00\x00\x00\xe8\x76\x48\x27\x42\x95\x01\x00\x00\x43\x44\x9d\x01\x66\x66\x92\x41\xa0\x01\xce\xdf\xb8\xba\x01\xab\x01\x0d\xcd\xcc\xe2\x41\x0d\xcd\xcc\x4c\x3e\x0d\x00\x00\x80\x3f\x12\x05\x6f\x75\x6e\x63\x65\x12\x05\x63\x61\x72\x61\x74\x12\x04\x67\x72\x61\x6d\xac\x01\xb3\x01\x0b\xa2\x06\x05\x0b\x08\x96\x4a\x0c\x0c\xb4\x01' | $CLICKHOUSE_CLIENT --query="INSERT INTO in_persons_00825 FORMAT Protobuf SETTINGS format_schema = '$CURDIR/00825_protobuf_format_syntax2:Syntax2Person'"
|
||||
echo -ne '\x04\x08\x02\x10\x04\x00\x04\x08\x03\x10\x09' | $CLICKHOUSE_CLIENT --query="INSERT INTO in_squares_00825 FORMAT Protobuf SETTINGS format_schema = '$CURDIR/00825_protobuf_format:NumberAndSquare'"
|
@ -1,18 +0,0 @@
|
||||
a7da1aa6-f425-4789-8947-b034786ed374 Vasily Sidorov male 1995-07-28 bmp +442012345678 1 2018-12-30 00:00:00 23 leo ['Sunny'] [250,244,10] Murmansk [68.970680,33.074982] 3.14159265358979 100000000000.00 800 -3.2 154400000 ['pound'] [16] 503 []
|
||||
c694ad8a-f714-4ea3-907d-fd54fb25d9b5 Natalia Sokolova female 1992-03-08 jpg \N 0 \N 26 pisces [] [100,200,50] Plymouth [50.403724,-4.142123] 3.14159 \N 0.007 5.4 -20000000000000 [] [] \N []
|
||||
aa0e5a06-cab2-4034-a6a2-48e82b91664e Leonid Kirillov male 1983-06-24 \N +74950275864\0 1 2019-02-04 09:45:00 35 cancer ['7 rings','Eastside','Last Hurrah'] [0,0,255] San Diego [32.823943,-117.081327] 3.1415927 15000000.00 186.75 -2.1 20659829331 ['minute','hour'] [60,3600] \N [1800]
|
||||
20fcd95a-332d-41db-a9ec-161f644d059c Frida Ermakova female 1978-12-12 \N 3124555929\0\0\0 0 2013-03-11 16:30:00 40 sagittarius [] [110,210,74] [42.000000,-88.000000] 3.1410000324249268 311.00 0.5 10.0 8010000009 ['KB','MB'] [1024,1048576] 700 [701]
|
||||
a7522158-3d41-4b77-ad69-6c598ee55c49 Ivan Petrov male 1980-12-29 png +74951234567\0 1 2019-01-05 18:45:00 38 capricorn ['Yesterday','Flowers'] [255,0,0] Moscow [55.753216,37.622504] 3.14 214.10 0.1 5.8 17060000000 ['meter','centimeter','kilometer'] [1,0.01,1000] 500 [501,502]
|
||||
3faee064-c4f7-4d34-b6f3-8d81c2b6a15d Nick Kolesnikov male 1998-12-26 bmp 412-687-5007\0 1 2018-11-19 05:59:59 20 capricorn ['Havana'] [128,0,128] Pittsburgh [40.517192,-79.949456] 3.1415926535898 50000000000.00 780 18.3 195500007 ['ounce','carat','gram'] [28.35,0.2,1] 9494 []
|
||||
7cfa6856-a54a-4786-b8e5-745159d52278 Isolde Lavrova female 1987-02-09 \N \N 1 \N 32 aquarius [] [255,0,255] [26.000000,-80.000000] 3.1415998935699463 \N 4.5 25.0 -11111111111111 ['Byte','Bit'] [8,1] 702 []
|
||||
0 0
|
||||
2 4
|
||||
3 9
|
||||
a7da1aa6-f425-4789-8947-b034786ed374 Vasily Sidorov male 1995-07-28 bmp +442012345678 1 2018-12-30 00:00:00 23 leo ['Sunny'] [250,244,10] Murmansk [68.970680,33.074982] 3.14159265358979 100000000000.00 800 -3.2 154400000 ['pound'] [16] 503 []
|
||||
c694ad8a-f714-4ea3-907d-fd54fb25d9b5 Natalia Sokolova female 1992-03-08 jpg \N 0 \N 26 pisces [] [100,200,50] Plymouth [50.403724,-4.142123] 3.14159 \N 0.007 5.4 -20000000000000 [] [] \N []
|
||||
a7522158-3d41-4b77-ad69-6c598ee55c49 Ivan Petrov male 1980-12-29 png +74951234567\0 1 2019-01-05 18:45:00 38 capricorn ['Yesterday','Flowers'] [255,0,0] Moscow [55.753216,37.622504] 3.14 214.10 0.1 5.8 17060000000 ['meter','centimeter','kilometer'] [1,0.01,1000] 500 [501,502]
|
||||
3faee064-c4f7-4d34-b6f3-8d81c2b6a15d Nick Kolesnikov male 1998-12-26 bmp 412-687-5007\0 1 2018-11-19 05:59:59 20 capricorn ['Havana'] [128,0,128] Pittsburgh [40.517192,-79.949456] 3.1415926535898 50000000000.00 780 18.3 195500007 ['ounce','carat','gram'] [28.35,0.2,1] 9494 []
|
||||
2 4
|
||||
3 9
|
||||
ok
|
||||
ok
|
@ -1,77 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
CURDIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
|
||||
# shellcheck source=../shell_config.sh
|
||||
. "$CURDIR"/../shell_config.sh
|
||||
|
||||
set -eo pipefail
|
||||
|
||||
# Run the client.
|
||||
$CLICKHOUSE_CLIENT --multiquery <<'EOF'
|
||||
DROP TABLE IF EXISTS in_persons_00825;
|
||||
DROP TABLE IF EXISTS in_squares_00825;
|
||||
|
||||
CREATE TABLE in_persons_00825 (uuid UUID,
|
||||
name String,
|
||||
surname String,
|
||||
gender Enum8('male'=1, 'female'=0),
|
||||
birthDate Date,
|
||||
photo Nullable(String),
|
||||
phoneNumber Nullable(FixedString(13)),
|
||||
isOnline UInt8,
|
||||
visitTime Nullable(DateTime),
|
||||
age UInt8,
|
||||
zodiacSign Enum16('aries'=321, 'taurus'=420, 'gemini'=521, 'cancer'=621, 'leo'=723, 'virgo'=823,
|
||||
'libra'=923, 'scorpius'=1023, 'sagittarius'=1122, 'capricorn'=1222, 'aquarius'=120,
|
||||
'pisces'=219),
|
||||
songs Array(String),
|
||||
color Array(UInt8),
|
||||
hometown LowCardinality(String),
|
||||
location Array(Decimal32(6)),
|
||||
pi Nullable(Float64),
|
||||
lotteryWin Nullable(Decimal64(2)),
|
||||
someRatio Float32,
|
||||
temperature Decimal32(1),
|
||||
randomBigNumber Int64,
|
||||
measureUnits Nested (unit String, coef Float32),
|
||||
nestiness_a_b_c_d Nullable(UInt32),
|
||||
`nestiness_a_B.c_E` Array(UInt32)
|
||||
) ENGINE = MergeTree ORDER BY tuple();
|
||||
|
||||
CREATE TABLE in_squares_00825 (number UInt32, square UInt32) ENGINE = MergeTree ORDER BY tuple();
|
||||
EOF
|
||||
|
||||
# To generate the file 00825_protobuf_format_input.insh use the following commands:
|
||||
# ninja ProtobufDelimitedMessagesSerializer
|
||||
# build/utils/test-data-generator/ProtobufDelimitedMessagesSerializer
|
||||
# shellcheck source=./00825_protobuf_format_input.insh
|
||||
source "$CURDIR"/00825_protobuf_format_input.insh
|
||||
|
||||
$CLICKHOUSE_CLIENT --query "SELECT * FROM in_persons_00825 ORDER BY uuid;"
|
||||
$CLICKHOUSE_CLIENT --query "SELECT * FROM in_squares_00825 ORDER BY number;"
|
||||
|
||||
$CLICKHOUSE_CLIENT --query "TRUNCATE TABLE in_persons_00825;"
|
||||
$CLICKHOUSE_CLIENT --query "TRUNCATE TABLE in_squares_00825;"
|
||||
|
||||
# shellcheck source=./00825_protobuf_format_input_single.insh
|
||||
source "$CURDIR"/00825_protobuf_format_input_single.insh
|
||||
|
||||
$CLICKHOUSE_CLIENT --query "SELECT * FROM in_persons_00825 ORDER BY uuid;"
|
||||
$CLICKHOUSE_CLIENT --query "SELECT * FROM in_squares_00825 ORDER BY number;"
|
||||
|
||||
# Try to input malformed data.
|
||||
set +eo pipefail
|
||||
echo -ne '\xe0\x80\x3f\x0b' \
|
||||
| $CLICKHOUSE_CLIENT --query="INSERT INTO in_persons_00825 FORMAT Protobuf SETTINGS format_schema = '$CURDIR/00825_protobuf_format:Person'" 2>&1 \
|
||||
| grep -qF "Protobuf messages are corrupted" && echo "ok" || echo "fail"
|
||||
set -eo pipefail
|
||||
|
||||
# Try to input malformed data for ProtobufSingle
|
||||
set +eo pipefail
|
||||
echo -ne '\xff\xff\x3f\x0b' \
|
||||
| $CLICKHOUSE_CLIENT --query="INSERT INTO in_persons_00825 FORMAT ProtobufSingle SETTINGS format_schema = '$CURDIR/00825_protobuf_format:Person'" 2>&1 \
|
||||
| grep -qF "Protobuf messages are corrupted" && echo "ok" || echo "fail"
|
||||
set -eo pipefail
|
||||
|
||||
$CLICKHOUSE_CLIENT --query "DROP TABLE IF EXISTS in_persons_00825;"
|
||||
$CLICKHOUSE_CLIENT --query "DROP TABLE IF EXISTS in_squares_00825;"
|
@ -1,12 +0,0 @@
|
||||
echo -ne '\x0a\x24\x61\x37\x35\x32\x32\x31\x35\x38\x2d\x33\x64\x34\x31\x2d\x34\x62\x37\x37\x2d\x61\x64\x36\x39\x2d\x36\x63\x35\x39\x38\x65\x65\x35\x35\x63\x34\x39\x12\x04\x49\x76\x61\x6e\x1a\x06\x50\x65\x74\x72\x6f\x76\x20\x01\x28\xaf\x1f\x32\x03\x70\x6e\x67\x3a\x0c\x2b\x37\x34\x39\x35\x31\x32\x33\x34\x35\x36\x37\x40\x01\x4d\xfc\xd0\x30\x5c\x50\x26\x58\x09\x62\x09\x59\x65\x73\x74\x65\x72\x64\x61\x79\x62\x07\x46\x6c\x6f\x77\x65\x72\x73\x6a\x04\xff\x01\x00\x00\x72\x06\x4d\x6f\x73\x63\x6f\x77\x7a\x08\x4b\x03\x5f\x42\x72\x7d\x16\x42\x81\x01\x1f\x85\xeb\x51\xb8\x1e\x09\x40\x89\x01\x33\x33\x33\x33\x33\xc3\x6a\x40\x95\x01\xcd\xcc\xcc\x3d\x9d\x01\x9a\x99\xb9\x40\xa0\x01\x80\xc4\xd7\x8d\x7f\xaa\x01\x0c\x0a\x05\x6d\x65\x74\x65\x72\x15\x00\x00\x80\x3f\xaa\x01\x11\x0a\x0a\x63\x65\x6e\x74\x69\x6d\x65\x74\x65\x72\x15\x0a\xd7\x23\x3c\xaa\x01\x10\x0a\x09\x6b\x69\x6c\x6f\x6d\x65\x74\x65\x72\x15\x00\x00\x7a\x44\xb2\x01\x10\x0a\x0e\xa2\x06\x0b\x0a\x09\x08\xf4\x03\x12\x04\xf5\x03\xf6\x03' | $CLICKHOUSE_CLIENT --query="INSERT INTO in_persons_00825 FORMAT ProtobufSingle SETTINGS format_schema = '$CURDIR/00825_protobuf_format:Person'"
|
||||
echo -ne '\x0a\x24\x63\x36\x39\x34\x61\x64\x38\x61\x2d\x66\x37\x31\x34\x2d\x34\x65\x61\x33\x2d\x39\x30\x37\x64\x2d\x66\x64\x35\x34\x66\x62\x32\x35\x64\x39\x62\x35\x12\x07\x4e\x61\x74\x61\x6c\x69\x61\x1a\x08\x53\x6f\x6b\x6f\x6c\x6f\x76\x61\x28\xa6\x3f\x32\x03\x6a\x70\x67\x50\x1a\x58\x0b\x6a\x04\x64\xc8\x01\x32\x72\x08\x50\x6c\x79\x6d\x6f\x75\x74\x68\x7a\x08\x6a\x9d\x49\x42\x46\x8c\x84\xc0\x81\x01\x6e\x86\x1b\xf0\xf9\x21\x09\x40\x95\x01\x42\x60\xe5\x3b\x9d\x01\xcd\xcc\xac\x40\xa0\x01\xff\xff\xa9\xce\x93\x8c\x09' | $CLICKHOUSE_CLIENT --query="INSERT INTO in_persons_00825 FORMAT ProtobufSingle SETTINGS format_schema = '$CURDIR/00825_protobuf_format:Person'"
|
||||
echo -ne '\x0a\x24\x61\x37\x64\x61\x31\x61\x61\x36\x2d\x66\x34\x32\x35\x2d\x34\x37\x38\x39\x2d\x38\x39\x34\x37\x2d\x62\x30\x33\x34\x37\x38\x36\x65\x64\x33\x37\x34\x12\x06\x56\x61\x73\x69\x6c\x79\x1a\x07\x53\x69\x64\x6f\x72\x6f\x76\x20\x01\x28\xfb\x48\x32\x03\x62\x6d\x70\x3a\x0d\x2b\x34\x34\x32\x30\x31\x32\x33\x34\x35\x36\x37\x38\x40\x01\x4d\x50\xe0\x27\x5c\x50\x17\x58\x04\x62\x05\x53\x75\x6e\x6e\x79\x6a\x05\xfa\x01\xf4\x01\x0a\x72\x08\x4d\x75\x72\x6d\x61\x6e\x73\x6b\x7a\x08\xfd\xf0\x89\x42\xc8\x4c\x04\x42\x81\x01\x11\x2d\x44\x54\xfb\x21\x09\x40\x89\x01\x00\x00\x00\xe8\x76\x48\x37\x42\x95\x01\x00\x00\x48\x44\x9d\x01\xcd\xcc\x4c\xc0\xa0\x01\x80\xd4\x9f\x93\x01\xaa\x01\x0c\x0a\x05\x70\x6f\x75\x6e\x64\x15\x00\x00\x80\x41\xb2\x01\x0a\x0a\x08\xa2\x06\x05\x0a\x03\x08\xf7\x03' | $CLICKHOUSE_CLIENT --query="INSERT INTO in_persons_00825 FORMAT ProtobufSingle SETTINGS format_schema = '$CURDIR/00825_protobuf_format:Person'"
|
||||
echo -ne '\x0a\x24\x33\x66\x61\x65\x65\x30\x36\x34\x2d\x63\x34\x66\x37\x2d\x34\x64\x33\x34\x2d\x62\x36\x66\x33\x2d\x38\x64\x38\x31\x63\x32\x62\x36\x61\x31\x35\x64\x12\x04\x4e\x69\x63\x6b\x1a\x0a\x4b\x6f\x6c\x65\x73\x6e\x69\x6b\x6f\x76\x20\x01\x28\xda\x52\x32\x03\x62\x6d\x70\x3a\x0c\x34\x31\x32\x2d\x36\x38\x37\x2d\x35\x30\x30\x37\x40\x01\x4d\x2f\x27\xf2\x5b\x50\x14\x58\x09\x62\x06\x48\x61\x76\x61\x6e\x61\x68\x80\x01\x68\x00\x68\x80\x01\x72\x0a\x50\x69\x74\x74\x73\x62\x75\x72\x67\x68\x7a\x08\x9b\x11\x22\x42\x1f\xe6\x9f\xc2\x81\x01\x28\x2d\x44\x54\xfb\x21\x09\x40\x89\x01\x00\x00\x00\xe8\x76\x48\x27\x42\x95\x01\x00\x00\x43\x44\x9d\x01\x66\x66\x92\x41\xa0\x01\xce\xdf\xb8\xba\x01\xab\x01\x0d\xcd\xcc\xe2\x41\x0d\xcd\xcc\x4c\x3e\x0d\x00\x00\x80\x3f\x12\x05\x6f\x75\x6e\x63\x65\x12\x05\x63\x61\x72\x61\x74\x12\x04\x67\x72\x61\x6d\xac\x01\xb3\x01\x0b\xa2\x06\x05\x0b\x08\x96\x4a\x0c\x0c\xb4\x01' | $CLICKHOUSE_CLIENT --query="INSERT INTO in_persons_00825 FORMAT ProtobufSingle SETTINGS format_schema = '$CURDIR/00825_protobuf_format_syntax2:Syntax2Person'"
|
||||
|
||||
echo -ne '\x08\x02\x10\x04' | $CLICKHOUSE_CLIENT --query="INSERT INTO in_squares_00825 FORMAT ProtobufSingle SETTINGS format_schema = '$CURDIR/00825_protobuf_format:NumberAndSquare'"
|
||||
echo -ne '\x08\x03\x10\x09' | $CLICKHOUSE_CLIENT --query="INSERT INTO in_squares_00825 FORMAT ProtobufSingle SETTINGS format_schema = '$CURDIR/00825_protobuf_format:NumberAndSquare'"
|
||||
|
||||
### Actually empty Protobuf message is a valid message (with all values default).
|
||||
### It will work in Kafka but clickhouse-client forbids that:
|
||||
### Code: 108. DB::Exception: No data to insert
|
||||
## echo -ne '' | $CLICKHOUSE_CLIENT --query="INSERT INTO in_squares_00825 FORMAT ProtobufSingle SETTINGS format_schema = '$CURDIR/00825_protobuf_format:NumberAndSquare'"
|
@ -1,31 +1,30 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# https://github.com/ClickHouse/ClickHouse/issues/6497
|
||||
|
||||
CURDIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
|
||||
SCHEMADIR=$CURDIR/format_schemas
|
||||
# shellcheck source=../shell_config.sh
|
||||
. "$CURDIR"/../shell_config.sh
|
||||
|
||||
set -eo pipefail
|
||||
|
||||
# Run the client.
|
||||
$CLICKHOUSE_CLIENT --multiquery <<'EOF'
|
||||
$CLICKHOUSE_CLIENT --multiquery <<EOF
|
||||
SET allow_experimental_map_type = 1;
|
||||
|
||||
DROP TABLE IF EXISTS map_00825;
|
||||
DROP TABLE IF EXISTS map_protobuf_00825;
|
||||
|
||||
CREATE TABLE map_00825
|
||||
CREATE TABLE map_protobuf_00825
|
||||
(
|
||||
a Map(String, UInt32)
|
||||
) ENGINE = MergeTree ORDER BY tuple();
|
||||
|
||||
INSERT INTO map_00825 VALUES ({'x':5, 'y':7}), ({'z':11}), ({'temp':0}), ({'':0});
|
||||
INSERT INTO map_protobuf_00825 VALUES ({'x':5, 'y':7}), ({'z':11}), ({'temp':0}), ({'':0});
|
||||
|
||||
SELECT * FROM map_00825;
|
||||
SELECT * FROM map_protobuf_00825;
|
||||
EOF
|
||||
|
||||
BINARY_FILE_PATH=$(mktemp "$CURDIR/00825_protobuf_format_map.XXXXXX.binary")
|
||||
$CLICKHOUSE_CLIENT --query "SELECT * FROM map_00825 FORMAT Protobuf SETTINGS format_schema = '$CURDIR/00825_protobuf_format_map:Message'" > "$BINARY_FILE_PATH"
|
||||
$CLICKHOUSE_CLIENT --query "SELECT * FROM map_protobuf_00825 FORMAT Protobuf SETTINGS format_schema = '$SCHEMADIR/00825_protobuf_format_map:Message'" > "$BINARY_FILE_PATH"
|
||||
|
||||
# Check the output in the protobuf format
|
||||
echo
|
||||
@ -34,7 +33,8 @@ hexdump -C $BINARY_FILE_PATH
|
||||
|
||||
# Check the input in the protobuf format (now the table contains the same data twice).
|
||||
echo
|
||||
$CLICKHOUSE_CLIENT --query "INSERT INTO map_00825 FORMAT Protobuf SETTINGS format_schema='$CURDIR/00825_protobuf_format_map:Message'" < "$BINARY_FILE_PATH"
|
||||
$CLICKHOUSE_CLIENT --query "SELECT * FROM map_00825"
|
||||
$CLICKHOUSE_CLIENT --query "INSERT INTO map_protobuf_00825 FORMAT Protobuf SETTINGS format_schema='$SCHEMADIR/00825_protobuf_format_map:Message'" < "$BINARY_FILE_PATH"
|
||||
$CLICKHOUSE_CLIENT --query "SELECT * FROM map_protobuf_00825"
|
||||
|
||||
rm "$BINARY_FILE_PATH"
|
||||
$CLICKHOUSE_CLIENT --query "DROP TABLE map_protobuf_00825"
|
||||
|
@ -0,0 +1,52 @@
|
||||
[[(1),(2)],[(3),(4),(5)]]
|
||||
[[(6)]]
|
||||
[[]]
|
||||
[]
|
||||
|
||||
Binary representation:
|
||||
00000000 18 0a 08 12 02 18 01 12 02 18 02 0a 0c 12 02 18 |................|
|
||||
00000010 03 12 02 18 04 12 02 18 05 06 0a 04 12 02 18 06 |................|
|
||||
00000020 02 0a 00 00 |....|
|
||||
00000024
|
||||
|
||||
MESSAGE #1 AT 0x00000001
|
||||
x {
|
||||
y {
|
||||
z: 1
|
||||
}
|
||||
y {
|
||||
z: 2
|
||||
}
|
||||
}
|
||||
x {
|
||||
y {
|
||||
z: 3
|
||||
}
|
||||
y {
|
||||
z: 4
|
||||
}
|
||||
y {
|
||||
z: 5
|
||||
}
|
||||
}
|
||||
MESSAGE #2 AT 0x0000001A
|
||||
x {
|
||||
y {
|
||||
z: 6
|
||||
}
|
||||
}
|
||||
MESSAGE #3 AT 0x00000021
|
||||
x {
|
||||
}
|
||||
MESSAGE #4 AT 0x00000024
|
||||
|
||||
Binary representation is as expected
|
||||
|
||||
[[(1),(2)],[(3),(4),(5)]]
|
||||
[[(6)]]
|
||||
[[]]
|
||||
[]
|
||||
[[(1),(2)],[(3),(4),(5)]]
|
||||
[[(6)]]
|
||||
[[]]
|
||||
[]
|
36
tests/queries/0_stateless/00825_protobuf_format_nested_in_nested.sh
Executable file
36
tests/queries/0_stateless/00825_protobuf_format_nested_in_nested.sh
Executable file
@ -0,0 +1,36 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# https://github.com/ClickHouse/ClickHouse/issues/11117
|
||||
|
||||
CURDIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
|
||||
SCHEMADIR=$CURDIR/format_schemas
|
||||
# shellcheck source=../shell_config.sh
|
||||
. "$CURDIR"/../shell_config.sh
|
||||
|
||||
set -eo pipefail
|
||||
|
||||
# Run the client.
|
||||
$CLICKHOUSE_CLIENT --multiquery <<EOF
|
||||
DROP TABLE IF EXISTS nested_in_nested_protobuf_00825;
|
||||
|
||||
CREATE TABLE nested_in_nested_protobuf_00825 (x Nested (y Nested (z Int64))) ENGINE = MergeTree ORDER BY tuple();
|
||||
|
||||
INSERT INTO nested_in_nested_protobuf_00825 VALUES ([[(1),(2)],[(3),(4),(5)]]), ([[(6)]]), ([[]]), ([]);
|
||||
|
||||
SELECT * FROM nested_in_nested_protobuf_00825;
|
||||
EOF
|
||||
|
||||
BINARY_FILE_PATH=$(mktemp "$CURDIR/00825_protobuf_format_nested_in_nested.XXXXXX.binary")
|
||||
$CLICKHOUSE_CLIENT --query "SELECT * FROM nested_in_nested_protobuf_00825 FORMAT Protobuf SETTINGS format_schema = '$SCHEMADIR/00825_protobuf_format_nested_in_nested:MessageType'" > "$BINARY_FILE_PATH"
|
||||
|
||||
# Check the output in the protobuf format
|
||||
echo
|
||||
$CURDIR/helpers/protobuf_length_delimited_encoder.py --decode_and_check --format_schema "$SCHEMADIR/00825_protobuf_format_nested_in_nested:MessageType" --input "$BINARY_FILE_PATH"
|
||||
|
||||
# Check the input in the protobuf format (now the table contains the same data twice).
|
||||
echo
|
||||
$CLICKHOUSE_CLIENT --query "INSERT INTO nested_in_nested_protobuf_00825 FORMAT Protobuf SETTINGS format_schema='$SCHEMADIR/00825_protobuf_format_nested_in_nested:MessageType'" < "$BINARY_FILE_PATH"
|
||||
$CLICKHOUSE_CLIENT --query "SELECT * FROM nested_in_nested_protobuf_00825"
|
||||
|
||||
rm "$BINARY_FILE_PATH"
|
||||
$CLICKHOUSE_CLIENT --query "DROP TABLE nested_in_nested_protobuf_00825"
|
@ -3,13 +3,14 @@
|
||||
# https://github.com/ClickHouse/ClickHouse/issues/6497
|
||||
|
||||
CURDIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
|
||||
SCHEMADIR=$CURDIR/format_schemas
|
||||
# shellcheck source=../shell_config.sh
|
||||
. "$CURDIR"/../shell_config.sh
|
||||
|
||||
set -eo pipefail
|
||||
|
||||
# Run the client.
|
||||
$CLICKHOUSE_CLIENT --multiquery <<'EOF'
|
||||
$CLICKHOUSE_CLIENT --multiquery <<EOF
|
||||
DROP TABLE IF EXISTS nested_optional_protobuf_00825;
|
||||
|
||||
CREATE TABLE nested_optional_protobuf_00825
|
||||
@ -27,15 +28,16 @@ SELECT * FROM nested_optional_protobuf_00825;
|
||||
EOF
|
||||
|
||||
BINARY_FILE_PATH=$(mktemp "$CURDIR/00825_protobuf_format_nested_optional.XXXXXX.binary")
|
||||
$CLICKHOUSE_CLIENT --query "SELECT * FROM nested_optional_protobuf_00825 FORMAT Protobuf SETTINGS format_schema = '$CURDIR/00825_protobuf_format_nested_optional:Message'" > "$BINARY_FILE_PATH"
|
||||
$CLICKHOUSE_CLIENT --query "SELECT * FROM nested_optional_protobuf_00825 FORMAT Protobuf SETTINGS format_schema = '$SCHEMADIR/00825_protobuf_format_nested_optional:Message'" > "$BINARY_FILE_PATH"
|
||||
|
||||
# Check the output in the protobuf format
|
||||
echo
|
||||
$CURDIR/helpers/protobuf_length_delimited_encoder.py --decode_and_check --format_schema "$CURDIR/00825_protobuf_format_nested_optional:Message" --input "$BINARY_FILE_PATH"
|
||||
$CURDIR/helpers/protobuf_length_delimited_encoder.py --decode_and_check --format_schema "$SCHEMADIR/00825_protobuf_format_nested_optional:Message" --input "$BINARY_FILE_PATH"
|
||||
|
||||
# Check the input in the protobuf format (now the table contains the same data twice).
|
||||
echo
|
||||
$CLICKHOUSE_CLIENT --query "INSERT INTO nested_optional_protobuf_00825 FORMAT Protobuf SETTINGS format_schema='$CURDIR/00825_protobuf_format_nested_optional:Message'" < "$BINARY_FILE_PATH"
|
||||
$CLICKHOUSE_CLIENT --query "INSERT INTO nested_optional_protobuf_00825 FORMAT Protobuf SETTINGS format_schema='$SCHEMADIR/00825_protobuf_format_nested_optional:Message'" < "$BINARY_FILE_PATH"
|
||||
$CLICKHOUSE_CLIENT --query "SELECT * FROM nested_optional_protobuf_00825"
|
||||
|
||||
rm "$BINARY_FILE_PATH"
|
||||
$CLICKHOUSE_CLIENT --query "DROP TABLE nested_optional_protobuf_00825"
|
||||
|
@ -0,0 +1,13 @@
|
||||
1000 1K
|
||||
2000 2K
|
||||
3000 3K
|
||||
|
||||
Binary representation:
|
||||
00000000 08 e8 07 12 02 31 4b |.....1K|
|
||||
00000007
|
||||
|
||||
x: 1000
|
||||
str: "1K"
|
||||
|
||||
Roundtrip:
|
||||
1000 1K
|
52
tests/queries/0_stateless/00825_protobuf_format_no_length_delimiter.sh
Executable file
52
tests/queries/0_stateless/00825_protobuf_format_no_length_delimiter.sh
Executable file
@ -0,0 +1,52 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
CURDIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
|
||||
SCHEMADIR=$CURDIR/format_schemas
|
||||
# shellcheck source=../shell_config.sh
|
||||
. "$CURDIR"/../shell_config.sh
|
||||
|
||||
set -eo pipefail
|
||||
|
||||
# Run the client.
|
||||
$CLICKHOUSE_CLIENT --multiquery <<EOF
|
||||
DROP TABLE IF EXISTS no_length_delimiter_protobuf_00825;
|
||||
DROP TABLE IF EXISTS roundtrip_no_length_delimiter_protobuf_00825;
|
||||
|
||||
CREATE TABLE no_length_delimiter_protobuf_00825
|
||||
(
|
||||
x Int32,
|
||||
str String
|
||||
) ENGINE = MergeTree ORDER BY tuple();
|
||||
|
||||
INSERT INTO no_length_delimiter_protobuf_00825 VALUES (1000, '1K'), (2000, '2K'), (3000, '3K');
|
||||
SELECT * FROM no_length_delimiter_protobuf_00825;
|
||||
EOF
|
||||
|
||||
BINARY_FILE_PATH=$(mktemp "$CURDIR/00825_protobuf_format_no_length_delimiter.XXXXXX.binary")
|
||||
$CLICKHOUSE_CLIENT --query "SELECT * FROM no_length_delimiter_protobuf_00825 LIMIT 1 FORMAT ProtobufSingle SETTINGS format_schema = '$SCHEMADIR/00825_protobuf_format_no_length_delimiter:Message'" > "$BINARY_FILE_PATH"
|
||||
|
||||
# Check the output in the ProtobufSingle format
|
||||
echo
|
||||
echo "Binary representation:"
|
||||
hexdump -C $BINARY_FILE_PATH
|
||||
|
||||
echo
|
||||
(cd $SCHEMADIR && protoc --decode Message 00825_protobuf_format_no_length_delimiter.proto) < $BINARY_FILE_PATH
|
||||
|
||||
# Check the input in the ProtobufSingle format.
|
||||
echo
|
||||
echo "Roundtrip:"
|
||||
$CLICKHOUSE_CLIENT --query "CREATE TABLE roundtrip_no_length_delimiter_protobuf_00825 AS no_length_delimiter_protobuf_00825"
|
||||
$CLICKHOUSE_CLIENT --query "INSERT INTO roundtrip_no_length_delimiter_protobuf_00825 FORMAT ProtobufSingle SETTINGS format_schema='$SCHEMADIR/00825_protobuf_format_no_length_delimiter:Message'" < "$BINARY_FILE_PATH"
|
||||
$CLICKHOUSE_CLIENT --query "SELECT * FROM roundtrip_no_length_delimiter_protobuf_00825"
|
||||
rm "$BINARY_FILE_PATH"
|
||||
|
||||
# The ProtobufSingle format can't be used to write multiple rows because this format doesn't have any row delimiter.
|
||||
$CLICKHOUSE_CLIENT --multiquery --testmode > /dev/null <<EOF
|
||||
SELECT * FROM no_length_delimiter_protobuf_00825 FORMAT ProtobufSingle SETTINGS format_schema = '$SCHEMADIR/00825_protobuf_format_no_length_delimiter:Message'; -- { clientError 546 }
|
||||
EOF
|
||||
|
||||
$CLICKHOUSE_CLIENT --multiquery <<EOF
|
||||
DROP TABLE no_length_delimiter_protobuf_00825;
|
||||
DROP TABLE roundtrip_no_length_delimiter_protobuf_00825;
|
||||
EOF
|
Binary file not shown.
@ -1,79 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# To generate reference file for this test use the following commands:
|
||||
# ninja ProtobufDelimitedMessagesSerializer
|
||||
# build/utils/test-data-generator/ProtobufDelimitedMessagesSerializer
|
||||
|
||||
CURDIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
|
||||
# shellcheck source=../shell_config.sh
|
||||
. "$CURDIR"/../shell_config.sh
|
||||
|
||||
set -e -o pipefail
|
||||
|
||||
# Run the client.
|
||||
$CLICKHOUSE_CLIENT -mnT <<EOF
|
||||
DROP TABLE IF EXISTS out_persons_00825;
|
||||
DROP TABLE IF EXISTS out_squares_00825;
|
||||
|
||||
CREATE TABLE out_persons_00825 (uuid UUID,
|
||||
name String,
|
||||
surname String,
|
||||
gender Enum8('male'=1, 'female'=0),
|
||||
birthDate Date,
|
||||
photo Nullable(String),
|
||||
phoneNumber Nullable(FixedString(13)),
|
||||
isOnline UInt8,
|
||||
visitTime Nullable(DateTime),
|
||||
age UInt8,
|
||||
zodiacSign Enum16('aries'=321, 'taurus'=420, 'gemini'=521, 'cancer'=621, 'leo'=723, 'virgo'=823,
|
||||
'libra'=923, 'scorpius'=1023, 'sagittarius'=1122, 'capricorn'=1222, 'aquarius'=120,
|
||||
'pisces'=219),
|
||||
songs Array(String),
|
||||
color Array(UInt8),
|
||||
hometown LowCardinality(String),
|
||||
location Array(Decimal32(6)),
|
||||
pi Nullable(Float64),
|
||||
lotteryWin Nullable(Decimal64(2)),
|
||||
someRatio Float32,
|
||||
temperature Decimal32(1),
|
||||
randomBigNumber Int64,
|
||||
measureUnits Nested(unit String, coef Float32),
|
||||
nestiness_a_b_c_d Nullable(UInt32),
|
||||
\`nestiness_a_B.c_E\` Array(UInt32)
|
||||
) ENGINE = MergeTree ORDER BY tuple();
|
||||
|
||||
CREATE TABLE out_squares_00825 (number UInt32, square UInt64) ENGINE = MergeTree ORDER BY tuple();
|
||||
|
||||
INSERT INTO out_persons_00825 VALUES (toUUID('a7522158-3d41-4b77-ad69-6c598ee55c49'), 'Ivan', 'Petrov', 'male', toDate('1980-12-29'), 'png', '+74951234567', 1, toDateTime('2019-01-05 18:45:00'), 38, 'capricorn', ['Yesterday', 'Flowers'], [255, 0, 0], 'Moscow', [55.753215, 37.622504], 3.14, 214.10, 0.1, 5.8, 17060000000, ['meter', 'centimeter', 'kilometer'], [1, 0.01, 1000], 500, [501, 502]);
|
||||
INSERT INTO out_persons_00825 VALUES (toUUID('c694ad8a-f714-4ea3-907d-fd54fb25d9b5'), 'Natalia', 'Sokolova', 'female', toDate('1992-03-08'), 'jpg', NULL, 0, NULL, 26, 'pisces', [], [100, 200, 50], 'Plymouth', [50.403724, -4.142123], 3.14159, NULL, 0.007, 5.4, -20000000000000, [], [], NULL, []);
|
||||
INSERT INTO out_persons_00825 VALUES (toUUID('a7da1aa6-f425-4789-8947-b034786ed374'), 'Vasily', 'Sidorov', 'male', toDate('1995-07-28'), 'bmp', '+442012345678', 1, toDateTime('2018-12-30 00:00:00'), 23, 'leo', ['Sunny'], [250, 244, 10], 'Murmansk', [68.970682, 33.074981], 3.14159265358979, 100000000000, 800, -3.2, 154400000, ['pound'], [16], 503, []);
|
||||
INSERT INTO out_squares_00825 VALUES (2, 4), (0, 0), (3, 9);
|
||||
|
||||
SELECT * FROM out_persons_00825 ORDER BY name FORMAT Protobuf SETTINGS format_schema = '$CURDIR/00825_protobuf_format:Person';
|
||||
SELECT 'ALTERNATIVE->';
|
||||
SELECT * FROM out_persons_00825 ORDER BY name FORMAT Protobuf SETTINGS format_schema = '$CURDIR/00825_protobuf_format:AltPerson';
|
||||
SELECT 'STRINGS->';
|
||||
SELECT * FROM out_persons_00825 ORDER BY name FORMAT Protobuf SETTINGS format_schema = '$CURDIR/00825_protobuf_format:StrPerson';
|
||||
SELECT 'SYNTAX2->';
|
||||
SELECT * FROM out_persons_00825 ORDER BY name FORMAT Protobuf SETTINGS format_schema = '$CURDIR/00825_protobuf_format_syntax2:Syntax2Person';
|
||||
SELECT 'SQUARES->';
|
||||
SELECT * FROM out_squares_00825 ORDER BY number FORMAT Protobuf SETTINGS format_schema = '$CURDIR/00825_protobuf_format:NumberAndSquare';
|
||||
|
||||
SELECT '\n\n** ProtobufSingle **\n\n';
|
||||
|
||||
SELECT * FROM out_persons_00825 ORDER BY name LIMIT 1 FORMAT ProtobufSingle SETTINGS format_schema = '$CURDIR/00825_protobuf_format:Person';
|
||||
SELECT 'ALTERNATIVE->';
|
||||
SELECT * FROM out_persons_00825 ORDER BY name LIMIT 1 FORMAT ProtobufSingle SETTINGS format_schema = '$CURDIR/00825_protobuf_format:AltPerson';
|
||||
SELECT 'STRINGS->';
|
||||
SELECT * FROM out_persons_00825 ORDER BY name LIMIT 1 FORMAT ProtobufSingle SETTINGS format_schema = '$CURDIR/00825_protobuf_format:StrPerson';
|
||||
SELECT 'SYNTAX2->';
|
||||
SELECT * FROM out_persons_00825 ORDER BY name LIMIT 1 FORMAT ProtobufSingle SETTINGS format_schema = '$CURDIR/00825_protobuf_format_syntax2:Syntax2Person';
|
||||
SELECT 'SQUARES->';
|
||||
SELECT * FROM out_squares_00825 ORDER BY number LIMIT 1 FORMAT ProtobufSingle SETTINGS format_schema = '$CURDIR/00825_protobuf_format:NumberAndSquare';
|
||||
|
||||
-- Code: 546, e.displayText() = DB::Exception: The ProtobufSingle format can't be used to write multiple rows because this format doesn't have any row delimiter.
|
||||
SELECT * FROM out_persons_00825 ORDER BY name FORMAT ProtobufSingle SETTINGS format_schema = '$CURDIR/00825_protobuf_format:Person'; -- { clientError 546 }
|
||||
|
||||
DROP TABLE IF EXISTS out_persons_00825;
|
||||
DROP TABLE IF EXISTS out_squares_00825;
|
||||
EOF
|
@ -0,0 +1,569 @@
|
||||
a7522158-3d41-4b77-ad69-6c598ee55c49 Ivan Petrov male 1980-12-29 png +74951234567\0 1 2019-01-05 18:45:00 38 capricorn ['Yesterday','Flowers'] [255,0,0] Moscow [55.753215,37.622504] 3.14 214.10 0.1 5.8 17060000000 ['meter','centimeter','kilometer'] [1,0.01,1000] 500 [501,502]
|
||||
c694ad8a-f714-4ea3-907d-fd54fb25d9b5 Natalia Sokolova female 1992-03-08 jpg \N 0 \N 26 pisces [] [100,200,50] Plymouth [50.403724,-4.142123] 3.14159 \N 0.007 5.4 -20000000000000 [] [] \N []
|
||||
a7da1aa6-f425-4789-8947-b034786ed374 Vasily Sidorov male 1995-07-28 bmp +442012345678 1 2018-12-30 00:00:00 23 leo ['Sunny'] [250,244,10] Murmansk [68.970682,33.074981] 3.14159265358979 100000000000.00 800 -3.2 154400000 ['pound'] [16] 503 []
|
||||
|
||||
Schema 00825_protobuf_format_persons:Person
|
||||
|
||||
Binary representation:
|
||||
00000000 f4 01 0a 24 61 37 35 32 32 31 35 38 2d 33 64 34 |...$a7522158-3d4|
|
||||
00000010 31 2d 34 62 37 37 2d 61 64 36 39 2d 36 63 35 39 |1-4b77-ad69-6c59|
|
||||
00000020 38 65 65 35 35 63 34 39 12 04 49 76 61 6e 1a 06 |8ee55c49..Ivan..|
|
||||
00000030 50 65 74 72 6f 76 20 01 28 af 1f 32 03 70 6e 67 |Petrov .(..2.png|
|
||||
00000040 3a 0d 2b 37 34 39 35 31 32 33 34 35 36 37 00 40 |:.+74951234567.@|
|
||||
00000050 01 4d fc d0 30 5c 50 26 58 09 62 09 59 65 73 74 |.M..0\P&X.b.Yest|
|
||||
00000060 65 72 64 61 79 62 07 46 6c 6f 77 65 72 73 6a 04 |erdayb.Flowersj.|
|
||||
00000070 ff 01 00 00 72 06 4d 6f 73 63 6f 77 7a 08 4b 03 |....r.Moscowz.K.|
|
||||
00000080 5f 42 72 7d 16 42 81 01 1f 85 eb 51 b8 1e 09 40 |_Br}.B.....Q...@|
|
||||
00000090 89 01 33 33 33 33 33 c3 6a 40 95 01 cd cc cc 3d |..33333.j@.....=|
|
||||
000000a0 9d 01 9a 99 b9 40 a0 01 80 c4 d7 8d 7f aa 01 0c |.....@..........|
|
||||
000000b0 0a 05 6d 65 74 65 72 15 00 00 80 3f aa 01 11 0a |..meter....?....|
|
||||
000000c0 0a 63 65 6e 74 69 6d 65 74 65 72 15 0a d7 23 3c |.centimeter...#<|
|
||||
000000d0 aa 01 10 0a 09 6b 69 6c 6f 6d 65 74 65 72 15 00 |.....kilometer..|
|
||||
000000e0 00 7a 44 b2 01 10 0a 0e a2 06 0b 0a 09 08 f4 03 |.zD.............|
|
||||
000000f0 12 04 f5 03 f6 03 7e 0a 24 63 36 39 34 61 64 38 |......~.$c694ad8|
|
||||
00000100 61 2d 66 37 31 34 2d 34 65 61 33 2d 39 30 37 64 |a-f714-4ea3-907d|
|
||||
00000110 2d 66 64 35 34 66 62 32 35 64 39 62 35 12 07 4e |-fd54fb25d9b5..N|
|
||||
00000120 61 74 61 6c 69 61 1a 08 53 6f 6b 6f 6c 6f 76 61 |atalia..Sokolova|
|
||||
00000130 28 a6 3f 32 03 6a 70 67 50 1a 58 0b 6a 04 64 c8 |(.?2.jpgP.X.j.d.|
|
||||
00000140 01 32 72 08 50 6c 79 6d 6f 75 74 68 7a 08 6a 9d |.2r.Plymouthz.j.|
|
||||
00000150 49 42 46 8c 84 c0 81 01 6e 86 1b f0 f9 21 09 40 |IBF.....n....!.@|
|
||||
00000160 95 01 42 60 e5 3b 9d 01 cd cc ac 40 a0 01 ff ff |..B`.;.....@....|
|
||||
00000170 a9 ce 93 8c 09 c0 01 0a 24 61 37 64 61 31 61 61 |........$a7da1aa|
|
||||
00000180 36 2d 66 34 32 35 2d 34 37 38 39 2d 38 39 34 37 |6-f425-4789-8947|
|
||||
00000190 2d 62 30 33 34 37 38 36 65 64 33 37 34 12 06 56 |-b034786ed374..V|
|
||||
000001a0 61 73 69 6c 79 1a 07 53 69 64 6f 72 6f 76 20 01 |asily..Sidorov .|
|
||||
000001b0 28 fb 48 32 03 62 6d 70 3a 0d 2b 34 34 32 30 31 |(.H2.bmp:.+44201|
|
||||
000001c0 32 33 34 35 36 37 38 40 01 4d 50 e0 27 5c 50 17 |2345678@.MP.'\P.|
|
||||
000001d0 58 04 62 05 53 75 6e 6e 79 6a 05 fa 01 f4 01 0a |X.b.Sunnyj......|
|
||||
000001e0 72 08 4d 75 72 6d 61 6e 73 6b 7a 08 fd f0 89 42 |r.Murmanskz....B|
|
||||
000001f0 c8 4c 04 42 81 01 11 2d 44 54 fb 21 09 40 89 01 |.L.B...-DT.!.@..|
|
||||
00000200 00 00 00 e8 76 48 37 42 95 01 00 00 48 44 9d 01 |....vH7B....HD..|
|
||||
00000210 cd cc 4c c0 a0 01 80 d4 9f 93 01 aa 01 0c 0a 05 |..L.............|
|
||||
00000220 70 6f 75 6e 64 15 00 00 80 41 b2 01 0a 0a 08 a2 |pound....A......|
|
||||
00000230 06 05 0a 03 08 f7 03 |.......|
|
||||
00000237
|
||||
|
||||
MESSAGE #1 AT 0x00000002
|
||||
uuid: "a7522158-3d41-4b77-ad69-6c598ee55c49"
|
||||
name: "Ivan"
|
||||
surname: "Petrov"
|
||||
gender: male
|
||||
birthDate: 4015
|
||||
photo: "png"
|
||||
phoneNumber: "+74951234567\000"
|
||||
isOnline: true
|
||||
visitTime: 1546703100
|
||||
age: 38
|
||||
zodiacSign: capricorn
|
||||
songs: "Yesterday"
|
||||
songs: "Flowers"
|
||||
color: 255
|
||||
color: 0
|
||||
color: 0
|
||||
hometown: "Moscow"
|
||||
location: 55.7532158
|
||||
location: 37.6225052
|
||||
pi: 3.14
|
||||
lotteryWin: 214.1
|
||||
someRatio: 0.1
|
||||
temperature: 5.8
|
||||
randomBigNumber: 17060000000
|
||||
measureUnits {
|
||||
unit: "meter"
|
||||
coef: 1
|
||||
}
|
||||
measureUnits {
|
||||
unit: "centimeter"
|
||||
coef: 0.01
|
||||
}
|
||||
measureUnits {
|
||||
unit: "kilometer"
|
||||
coef: 1000
|
||||
}
|
||||
nestiness {
|
||||
a {
|
||||
b {
|
||||
c {
|
||||
d: 500
|
||||
e: 501
|
||||
e: 502
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
MESSAGE #2 AT 0x000000F7
|
||||
uuid: "c694ad8a-f714-4ea3-907d-fd54fb25d9b5"
|
||||
name: "Natalia"
|
||||
surname: "Sokolova"
|
||||
birthDate: 8102
|
||||
photo: "jpg"
|
||||
age: 26
|
||||
zodiacSign: pisces
|
||||
color: 100
|
||||
color: 200
|
||||
color: 50
|
||||
hometown: "Plymouth"
|
||||
location: 50.4037247
|
||||
location: -4.14212322
|
||||
pi: 3.14159
|
||||
someRatio: 0.007
|
||||
temperature: 5.4
|
||||
randomBigNumber: -20000000000000
|
||||
MESSAGE #3 AT 0x00000177
|
||||
uuid: "a7da1aa6-f425-4789-8947-b034786ed374"
|
||||
name: "Vasily"
|
||||
surname: "Sidorov"
|
||||
gender: male
|
||||
birthDate: 9339
|
||||
photo: "bmp"
|
||||
phoneNumber: "+442012345678"
|
||||
isOnline: true
|
||||
visitTime: 1546117200
|
||||
age: 23
|
||||
zodiacSign: leo
|
||||
songs: "Sunny"
|
||||
color: 250
|
||||
color: 244
|
||||
color: 10
|
||||
hometown: "Murmansk"
|
||||
location: 68.9706802
|
||||
location: 33.0749817
|
||||
pi: 3.14159265358979
|
||||
lotteryWin: 100000000000
|
||||
someRatio: 800
|
||||
temperature: -3.2
|
||||
randomBigNumber: 154400000
|
||||
measureUnits {
|
||||
unit: "pound"
|
||||
coef: 16
|
||||
}
|
||||
nestiness {
|
||||
a {
|
||||
b {
|
||||
c {
|
||||
d: 503
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Binary representation is as expected
|
||||
|
||||
Roundtrip:
|
||||
a7522158-3d41-4b77-ad69-6c598ee55c49 Ivan Petrov male 1980-12-29 png +74951234567\0 1 2019-01-05 18:45:00 38 capricorn ['Yesterday','Flowers'] [255,0,0] Moscow [55.753216,37.622504] 3.14 214.10 0.1 5.8 17060000000 ['meter','centimeter','kilometer'] [1,0.01,1000] 500 [501,502]
|
||||
c694ad8a-f714-4ea3-907d-fd54fb25d9b5 Natalia Sokolova female 1992-03-08 jpg \N 0 \N 26 pisces [] [100,200,50] Plymouth [50.403724,-4.142123] 3.14159 \N 0.007 5.4 -20000000000000 [] [] \N []
|
||||
a7da1aa6-f425-4789-8947-b034786ed374 Vasily Sidorov male 1995-07-28 bmp +442012345678 1 2018-12-30 00:00:00 23 leo ['Sunny'] [250,244,10] Murmansk [68.970680,33.074982] 3.14159265358979 100000000000.00 800 -3.2 154400000 ['pound'] [16] 503 []
|
||||
|
||||
Schema 00825_protobuf_format_persons:AltPerson
|
||||
|
||||
Binary representation:
|
||||
00000000 c4 01 08 01 12 04 49 76 61 6e 28 87 a8 c4 9b 97 |......Ivan(.....|
|
||||
00000010 02 52 06 50 65 74 72 6f 76 72 0c 00 00 7f 43 00 |.R.Petrovr....C.|
|
||||
00000020 00 00 00 00 00 00 00 79 fc d0 30 5c 00 00 00 00 |.......y..0\....|
|
||||
00000030 c8 02 0a c2 05 0c 00 00 80 3f 0a d7 23 3c 00 00 |.........?..#<..|
|
||||
00000040 7a 44 9a 06 05 6d 65 74 65 72 9a 06 0a 63 65 6e |zD...meter...cen|
|
||||
00000050 74 69 6d 65 74 65 72 9a 06 09 6b 69 6c 6f 6d 65 |timeter...kilome|
|
||||
00000060 74 65 72 a1 06 00 00 00 a0 99 99 b9 3f a8 06 37 |ter.........?..7|
|
||||
00000070 a8 06 25 bd 06 c3 f5 48 40 fa 06 02 33 38 90 08 |..%....H@...38..|
|
||||
00000080 c6 09 e1 08 00 f1 da f8 03 00 00 00 b0 09 af 1f |................|
|
||||
00000090 d0 0c d6 01 e2 12 24 61 37 35 32 32 31 35 38 2d |......$a7522158-|
|
||||
000000a0 33 64 34 31 2d 34 62 37 37 2d 61 64 36 39 2d 36 |3d41-4b77-ad69-6|
|
||||
000000b0 63 35 39 38 65 65 35 35 63 34 39 a0 38 f4 03 aa |c598ee55c49.8...|
|
||||
000000c0 38 04 f5 03 f6 03 84 01 12 07 4e 61 74 61 6c 69 |8.........Natali|
|
||||
000000d0 61 52 08 53 6f 6b 6f 6c 6f 76 61 72 0c 00 00 c8 |aR.Sokolovar....|
|
||||
000000e0 42 00 00 48 43 00 00 48 42 c8 02 0a a1 06 00 00 |B..HC..HB.......|
|
||||
000000f0 00 40 08 ac 7c 3f a8 06 32 a8 06 fc ff ff ff ff |.@..|?..2.......|
|
||||
00000100 ff ff ff ff 01 b0 06 01 bd 06 d0 0f 49 40 fa 06 |............I@..|
|
||||
00000110 02 32 36 90 08 db 01 e1 08 00 c0 1a 63 cf ed ff |.26.........c...|
|
||||
00000120 ff b0 09 a6 3f e2 12 24 63 36 39 34 61 64 38 61 |....?..$c694ad8a|
|
||||
00000130 2d 66 37 31 34 2d 34 65 61 33 2d 39 30 37 64 2d |-f714-4ea3-907d-|
|
||||
00000140 66 64 35 34 66 62 32 35 64 39 62 35 a3 01 08 01 |fd54fb25d9b5....|
|
||||
00000150 12 06 56 61 73 69 6c 79 28 ce ca f4 cf ee 0c 52 |..Vasily(......R|
|
||||
00000160 07 53 69 64 6f 72 6f 76 72 0c 00 00 7a 43 00 00 |.Sidorovr...zC..|
|
||||
00000170 74 43 00 00 20 41 79 50 e0 27 5c 00 00 00 00 c8 |tC.. AyP.'\.....|
|
||||
00000180 02 05 c2 05 04 00 00 80 41 9a 06 05 70 6f 75 6e |........A...poun|
|
||||
00000190 64 a1 06 00 00 00 00 00 00 89 40 a8 06 44 a8 06 |d.........@..D..|
|
||||
000001a0 21 bd 06 db 0f 49 40 fa 06 02 32 33 90 08 d3 05 |!....I@...23....|
|
||||
000001b0 e1 08 00 f5 33 09 00 00 00 00 b0 09 fb 48 d0 0c |....3........H..|
|
||||
000001c0 80 d0 db c3 f4 02 e2 12 24 61 37 64 61 31 61 61 |........$a7da1aa|
|
||||
000001d0 36 2d 66 34 32 35 2d 34 37 38 39 2d 38 39 34 37 |6-f425-4789-8947|
|
||||
000001e0 2d 62 30 33 34 37 38 36 65 64 33 37 34 a0 38 f7 |-b034786ed374.8.|
|
||||
000001f0 03 |.|
|
||||
000001f1
|
||||
|
||||
MESSAGE #1 AT 0x00000002
|
||||
isOnline: online
|
||||
name: "Ivan"
|
||||
phoneNumber: 74951234567
|
||||
surname: "Petrov"
|
||||
color: 255
|
||||
color: 0
|
||||
color: 0
|
||||
visitTime: 1546703100
|
||||
temperature: 5
|
||||
measureUnits_coef: 1
|
||||
measureUnits_coef: 0.01
|
||||
measureUnits_coef: 1000
|
||||
measureUnits_unit: "meter"
|
||||
measureUnits_unit: "centimeter"
|
||||
measureUnits_unit: "kilometer"
|
||||
someRatio: 0.10000000149011612
|
||||
location: 55
|
||||
location: 37
|
||||
pi: 3.14
|
||||
age: "38"
|
||||
zodiacSign: 1222
|
||||
randomBigNumber: 17060000000
|
||||
birthDate: 4015
|
||||
lotteryWin: 214
|
||||
uuid: "a7522158-3d41-4b77-ad69-6c598ee55c49"
|
||||
nestiness_a_b_c_d: 500
|
||||
nestiness_a_b_c_e: 501
|
||||
nestiness_a_b_c_e: 502
|
||||
MESSAGE #2 AT 0x000000C8
|
||||
name: "Natalia"
|
||||
surname: "Sokolova"
|
||||
color: 100
|
||||
color: 200
|
||||
color: 50
|
||||
temperature: 5
|
||||
someRatio: 0.0070000002160668373
|
||||
location: 50
|
||||
location: -4
|
||||
gender: female
|
||||
pi: 3.14159
|
||||
age: "26"
|
||||
zodiacSign: 219
|
||||
randomBigNumber: -20000000000000
|
||||
birthDate: 8102
|
||||
uuid: "c694ad8a-f714-4ea3-907d-fd54fb25d9b5"
|
||||
MESSAGE #3 AT 0x0000014E
|
||||
isOnline: online
|
||||
name: "Vasily"
|
||||
phoneNumber: 442012345678
|
||||
surname: "Sidorov"
|
||||
color: 250
|
||||
color: 244
|
||||
color: 10
|
||||
visitTime: 1546117200
|
||||
temperature: -3
|
||||
measureUnits_coef: 16
|
||||
measureUnits_unit: "pound"
|
||||
someRatio: 800
|
||||
location: 68
|
||||
location: 33
|
||||
pi: 3.14159274
|
||||
age: "23"
|
||||
zodiacSign: 723
|
||||
randomBigNumber: 154400000
|
||||
birthDate: 9339
|
||||
lotteryWin: 100000000000
|
||||
uuid: "a7da1aa6-f425-4789-8947-b034786ed374"
|
||||
nestiness_a_b_c_d: 503
|
||||
|
||||
Binary representation is as expected
|
||||
|
||||
Roundtrip:
|
||||
a7522158-3d41-4b77-ad69-6c598ee55c49 Ivan Petrov male 1980-12-29 \N 74951234567\0\0 1 2019-01-05 18:45:00 38 capricorn [] [255,0,0] [55.000000,37.000000] 3.140000104904175 214.00 0.1 5.0 17060000000 ['meter','centimeter','kilometer'] [1,0.01,1000] 500 [501,502]
|
||||
c694ad8a-f714-4ea3-907d-fd54fb25d9b5 Natalia Sokolova female 1992-03-08 \N \N 0 \N 26 pisces [] [100,200,50] [50.000000,-4.000000] 3.141590118408203 \N 0.007 5.0 -20000000000000 [] [] \N []
|
||||
a7da1aa6-f425-4789-8947-b034786ed374 Vasily Sidorov male 1995-07-28 \N 442012345678\0 1 2018-12-30 00:00:00 23 leo [] [250,244,10] [68.000000,33.000000] 3.1415927410125732 100000000000.00 800 -3.0 154400000 ['pound'] [16] 503 []
|
||||
|
||||
Schema 00825_protobuf_format_persons:StrPerson
|
||||
|
||||
Binary representation:
|
||||
00000000 a7 02 0a 24 61 37 35 32 32 31 35 38 2d 33 64 34 |...$a7522158-3d4|
|
||||
00000010 31 2d 34 62 37 37 2d 61 64 36 39 2d 36 63 35 39 |1-4b77-ad69-6c59|
|
||||
00000020 38 65 65 35 35 63 34 39 12 04 49 76 61 6e 1a 06 |8ee55c49..Ivan..|
|
||||
00000030 50 65 74 72 6f 76 22 04 6d 61 6c 65 2a 0a 31 39 |Petrov".male*.19|
|
||||
00000040 38 30 2d 31 32 2d 32 39 3a 0d 2b 37 34 39 35 31 |80-12-29:.+74951|
|
||||
00000050 32 33 34 35 36 37 00 42 01 31 4a 13 32 30 31 39 |234567.B.1J.2019|
|
||||
00000060 2d 30 31 2d 30 35 20 31 38 3a 34 35 3a 30 30 52 |-01-05 18:45:00R|
|
||||
00000070 02 33 38 5a 09 63 61 70 72 69 63 6f 72 6e 62 09 |.38Z.capricornb.|
|
||||
00000080 59 65 73 74 65 72 64 61 79 62 07 46 6c 6f 77 65 |Yesterdayb.Flowe|
|
||||
00000090 72 73 6a 03 32 35 35 6a 01 30 6a 01 30 72 06 4d |rsj.255j.0j.0r.M|
|
||||
000000a0 6f 73 63 6f 77 7a 09 35 35 2e 37 35 33 32 31 35 |oscowz.55.753215|
|
||||
000000b0 7a 09 33 37 2e 36 32 32 35 30 34 82 01 04 33 2e |z.37.622504...3.|
|
||||
000000c0 31 34 8a 01 06 32 31 34 2e 31 30 92 01 03 30 2e |14...214.10...0.|
|
||||
000000d0 31 9a 01 03 35 2e 38 a2 01 0b 31 37 30 36 30 30 |1...5.8...170600|
|
||||
000000e0 30 30 30 30 30 aa 01 2d 0a 05 6d 65 74 65 72 0a |00000..-..meter.|
|
||||
000000f0 0a 63 65 6e 74 69 6d 65 74 65 72 0a 09 6b 69 6c |.centimeter..kil|
|
||||
00000100 6f 6d 65 74 65 72 12 01 31 12 04 30 2e 30 31 12 |ometer..1..0.01.|
|
||||
00000110 04 31 30 30 30 b2 01 11 0a 0f 0a 03 35 30 30 12 |.1000.......500.|
|
||||
00000120 03 35 30 31 12 03 35 30 32 b4 01 0a 24 63 36 39 |.501..502...$c69|
|
||||
00000130 34 61 64 38 61 2d 66 37 31 34 2d 34 65 61 33 2d |4ad8a-f714-4ea3-|
|
||||
00000140 39 30 37 64 2d 66 64 35 34 66 62 32 35 64 39 62 |907d-fd54fb25d9b|
|
||||
00000150 35 12 07 4e 61 74 61 6c 69 61 1a 08 53 6f 6b 6f |5..Natalia..Soko|
|
||||
00000160 6c 6f 76 61 22 06 66 65 6d 61 6c 65 2a 0a 31 39 |lova".female*.19|
|
||||
00000170 39 32 2d 30 33 2d 30 38 42 01 30 52 02 32 36 5a |92-03-08B.0R.26Z|
|
||||
00000180 06 70 69 73 63 65 73 6a 03 31 30 30 6a 03 32 30 |.piscesj.100j.20|
|
||||
00000190 30 6a 02 35 30 72 08 50 6c 79 6d 6f 75 74 68 7a |0j.50r.Plymouthz|
|
||||
000001a0 09 35 30 2e 34 30 33 37 32 34 7a 09 2d 34 2e 31 |.50.403724z.-4.1|
|
||||
000001b0 34 32 31 32 33 82 01 07 33 2e 31 34 31 35 39 92 |42123...3.14159.|
|
||||
000001c0 01 05 30 2e 30 30 37 9a 01 03 35 2e 34 a2 01 0f |..0.007...5.4...|
|
||||
000001d0 2d 32 30 30 30 30 30 30 30 30 30 30 30 30 30 84 |-20000000000000.|
|
||||
000001e0 02 0a 24 61 37 64 61 31 61 61 36 2d 66 34 32 35 |..$a7da1aa6-f425|
|
||||
000001f0 2d 34 37 38 39 2d 38 39 34 37 2d 62 30 33 34 37 |-4789-8947-b0347|
|
||||
00000200 38 36 65 64 33 37 34 12 06 56 61 73 69 6c 79 1a |86ed374..Vasily.|
|
||||
00000210 07 53 69 64 6f 72 6f 76 22 04 6d 61 6c 65 2a 0a |.Sidorov".male*.|
|
||||
00000220 31 39 39 35 2d 30 37 2d 32 38 3a 0d 2b 34 34 32 |1995-07-28:.+442|
|
||||
00000230 30 31 32 33 34 35 36 37 38 42 01 31 4a 13 32 30 |012345678B.1J.20|
|
||||
00000240 31 38 2d 31 32 2d 33 30 20 30 30 3a 30 30 3a 30 |18-12-30 00:00:0|
|
||||
00000250 30 52 02 32 33 5a 03 6c 65 6f 62 05 53 75 6e 6e |0R.23Z.leob.Sunn|
|
||||
00000260 79 6a 03 32 35 30 6a 03 32 34 34 6a 02 31 30 72 |yj.250j.244j.10r|
|
||||
00000270 08 4d 75 72 6d 61 6e 73 6b 7a 09 36 38 2e 39 37 |.Murmanskz.68.97|
|
||||
00000280 30 36 38 32 7a 09 33 33 2e 30 37 34 39 38 31 82 |0682z.33.074981.|
|
||||
00000290 01 10 33 2e 31 34 31 35 39 32 36 35 33 35 38 39 |..3.141592653589|
|
||||
000002a0 37 39 8a 01 0f 31 30 30 30 30 30 30 30 30 30 30 |79...10000000000|
|
||||
000002b0 30 2e 30 30 92 01 03 38 30 30 9a 01 04 2d 33 2e |0.00...800...-3.|
|
||||
000002c0 32 a2 01 09 31 35 34 34 30 30 30 30 30 aa 01 0b |2...154400000...|
|
||||
000002d0 0a 05 70 6f 75 6e 64 12 02 31 36 b2 01 07 0a 05 |..pound..16.....|
|
||||
000002e0 0a 03 35 30 33 |..503|
|
||||
000002e5
|
||||
|
||||
MESSAGE #1 AT 0x00000002
|
||||
uuid: "a7522158-3d41-4b77-ad69-6c598ee55c49"
|
||||
name: "Ivan"
|
||||
surname: "Petrov"
|
||||
gender: "male"
|
||||
birthDate: "1980-12-29"
|
||||
phoneNumber: "+74951234567\000"
|
||||
isOnline: "1"
|
||||
visitTime: "2019-01-05 18:45:00"
|
||||
age: "38"
|
||||
zodiacSign: "capricorn"
|
||||
songs: "Yesterday"
|
||||
songs: "Flowers"
|
||||
color: "255"
|
||||
color: "0"
|
||||
color: "0"
|
||||
hometown: "Moscow"
|
||||
location: "55.753215"
|
||||
location: "37.622504"
|
||||
pi: "3.14"
|
||||
lotteryWin: "214.10"
|
||||
someRatio: "0.1"
|
||||
temperature: "5.8"
|
||||
randomBigNumber: "17060000000"
|
||||
measureUnits {
|
||||
unit: "meter"
|
||||
unit: "centimeter"
|
||||
unit: "kilometer"
|
||||
coef: "1"
|
||||
coef: "0.01"
|
||||
coef: "1000"
|
||||
}
|
||||
nestiness_a {
|
||||
b_c {
|
||||
d: "500"
|
||||
e: "501"
|
||||
e: "502"
|
||||
}
|
||||
}
|
||||
MESSAGE #2 AT 0x0000012B
|
||||
uuid: "c694ad8a-f714-4ea3-907d-fd54fb25d9b5"
|
||||
name: "Natalia"
|
||||
surname: "Sokolova"
|
||||
gender: "female"
|
||||
birthDate: "1992-03-08"
|
||||
isOnline: "0"
|
||||
age: "26"
|
||||
zodiacSign: "pisces"
|
||||
color: "100"
|
||||
color: "200"
|
||||
color: "50"
|
||||
hometown: "Plymouth"
|
||||
location: "50.403724"
|
||||
location: "-4.142123"
|
||||
pi: "3.14159"
|
||||
someRatio: "0.007"
|
||||
temperature: "5.4"
|
||||
randomBigNumber: "-20000000000000"
|
||||
MESSAGE #3 AT 0x000001E1
|
||||
uuid: "a7da1aa6-f425-4789-8947-b034786ed374"
|
||||
name: "Vasily"
|
||||
surname: "Sidorov"
|
||||
gender: "male"
|
||||
birthDate: "1995-07-28"
|
||||
phoneNumber: "+442012345678"
|
||||
isOnline: "1"
|
||||
visitTime: "2018-12-30 00:00:00"
|
||||
age: "23"
|
||||
zodiacSign: "leo"
|
||||
songs: "Sunny"
|
||||
color: "250"
|
||||
color: "244"
|
||||
color: "10"
|
||||
hometown: "Murmansk"
|
||||
location: "68.970682"
|
||||
location: "33.074981"
|
||||
pi: "3.14159265358979"
|
||||
lotteryWin: "100000000000.00"
|
||||
someRatio: "800"
|
||||
temperature: "-3.2"
|
||||
randomBigNumber: "154400000"
|
||||
measureUnits {
|
||||
unit: "pound"
|
||||
coef: "16"
|
||||
}
|
||||
nestiness_a {
|
||||
b_c {
|
||||
d: "503"
|
||||
}
|
||||
}
|
||||
|
||||
Binary representation is as expected
|
||||
|
||||
Roundtrip:
|
||||
a7522158-3d41-4b77-ad69-6c598ee55c49 Ivan Petrov male 1980-12-29 \N +74951234567\0 1 2019-01-05 18:45:00 38 capricorn ['Yesterday','Flowers'] [255,0,0] Moscow [55.753215,37.622504] 3.14 214.10 0.1 5.8 17060000000 ['meter','centimeter','kilometer'] [1,0.01,1000] 500 [501,502]
|
||||
c694ad8a-f714-4ea3-907d-fd54fb25d9b5 Natalia Sokolova female 1992-03-08 \N \N 0 \N 26 pisces [] [100,200,50] Plymouth [50.403724,-4.142123] 3.14159 \N 0.007 5.4 -20000000000000 [] [] \N []
|
||||
a7da1aa6-f425-4789-8947-b034786ed374 Vasily Sidorov male 1995-07-28 \N +442012345678 1 2018-12-30 00:00:00 23 leo ['Sunny'] [250,244,10] Murmansk [68.970682,33.074981] 3.14159265358979 100000000000.00 800 -3.2 154400000 ['pound'] [16] 503 []
|
||||
|
||||
Schema 00825_protobuf_format_syntax2:Syntax2Person
|
||||
|
||||
Binary representation:
|
||||
00000000 f1 01 0a 24 61 37 35 32 32 31 35 38 2d 33 64 34 |...$a7522158-3d4|
|
||||
00000010 31 2d 34 62 37 37 2d 61 64 36 39 2d 36 63 35 39 |1-4b77-ad69-6c59|
|
||||
00000020 38 65 65 35 35 63 34 39 12 04 49 76 61 6e 1a 06 |8ee55c49..Ivan..|
|
||||
00000030 50 65 74 72 6f 76 20 01 28 af 1f 32 03 70 6e 67 |Petrov .(..2.png|
|
||||
00000040 3a 0d 2b 37 34 39 35 31 32 33 34 35 36 37 00 40 |:.+74951234567.@|
|
||||
00000050 01 4d fc d0 30 5c 50 26 58 09 62 09 59 65 73 74 |.M..0\P&X.b.Yest|
|
||||
00000060 65 72 64 61 79 62 07 46 6c 6f 77 65 72 73 68 ff |erdayb.Flowersh.|
|
||||
00000070 01 68 00 68 00 72 06 4d 6f 73 63 6f 77 7a 08 4b |.h.h.r.Moscowz.K|
|
||||
00000080 03 5f 42 72 7d 16 42 81 01 1f 85 eb 51 b8 1e 09 |._Br}.B.....Q...|
|
||||
00000090 40 89 01 33 33 33 33 33 c3 6a 40 95 01 cd cc cc |@..33333.j@.....|
|
||||
000000a0 3d 9d 01 9a 99 b9 40 a0 01 80 c4 d7 8d 7f ab 01 |=.....@.........|
|
||||
000000b0 0d 00 00 80 3f 0d 0a d7 23 3c 0d 00 00 7a 44 12 |....?...#<...zD.|
|
||||
000000c0 05 6d 65 74 65 72 12 0a 63 65 6e 74 69 6d 65 74 |.meter..centimet|
|
||||
000000d0 65 72 12 09 6b 69 6c 6f 6d 65 74 65 72 ac 01 b3 |er..kilometer...|
|
||||
000000e0 01 0b a2 06 0b 0b 08 f4 03 10 f5 03 10 f6 03 0c |................|
|
||||
000000f0 0c b4 01 83 01 0a 24 63 36 39 34 61 64 38 61 2d |......$c694ad8a-|
|
||||
00000100 66 37 31 34 2d 34 65 61 33 2d 39 30 37 64 2d 66 |f714-4ea3-907d-f|
|
||||
00000110 64 35 34 66 62 32 35 64 39 62 35 12 07 4e 61 74 |d54fb25d9b5..Nat|
|
||||
00000120 61 6c 69 61 1a 08 53 6f 6b 6f 6c 6f 76 61 20 00 |alia..Sokolova .|
|
||||
00000130 28 a6 3f 32 03 6a 70 67 40 00 50 1a 58 0b 68 64 |(.?2.jpg@.P.X.hd|
|
||||
00000140 68 c8 01 68 32 72 08 50 6c 79 6d 6f 75 74 68 7a |h..h2r.Plymouthz|
|
||||
00000150 08 6a 9d 49 42 46 8c 84 c0 81 01 6e 86 1b f0 f9 |.j.IBF.....n....|
|
||||
00000160 21 09 40 95 01 42 60 e5 3b 9d 01 cd cc ac 40 a0 |!.@..B`.;.....@.|
|
||||
00000170 01 ff ff a9 ce 93 8c 09 c3 01 0a 24 61 37 64 61 |...........$a7da|
|
||||
00000180 31 61 61 36 2d 66 34 32 35 2d 34 37 38 39 2d 38 |1aa6-f425-4789-8|
|
||||
00000190 39 34 37 2d 62 30 33 34 37 38 36 65 64 33 37 34 |947-b034786ed374|
|
||||
000001a0 12 06 56 61 73 69 6c 79 1a 07 53 69 64 6f 72 6f |..Vasily..Sidoro|
|
||||
000001b0 76 20 01 28 fb 48 32 03 62 6d 70 3a 0d 2b 34 34 |v .(.H2.bmp:.+44|
|
||||
000001c0 32 30 31 32 33 34 35 36 37 38 40 01 4d 50 e0 27 |2012345678@.MP.'|
|
||||
000001d0 5c 50 17 58 04 62 05 53 75 6e 6e 79 68 fa 01 68 |\P.X.b.Sunnyh..h|
|
||||
000001e0 f4 01 68 0a 72 08 4d 75 72 6d 61 6e 73 6b 7a 08 |..h.r.Murmanskz.|
|
||||
000001f0 fd f0 89 42 c8 4c 04 42 81 01 11 2d 44 54 fb 21 |...B.L.B...-DT.!|
|
||||
00000200 09 40 89 01 00 00 00 e8 76 48 37 42 95 01 00 00 |.@......vH7B....|
|
||||
00000210 48 44 9d 01 cd cc 4c c0 a0 01 80 d4 9f 93 01 ab |HD....L.........|
|
||||
00000220 01 0d 00 00 80 41 12 05 70 6f 75 6e 64 ac 01 b3 |.....A..pound...|
|
||||
00000230 01 0b a2 06 05 0b 08 f7 03 0c 0c b4 01 |.............|
|
||||
0000023d
|
||||
|
||||
MESSAGE #1 AT 0x00000002
|
||||
uuid: "a7522158-3d41-4b77-ad69-6c598ee55c49"
|
||||
name: "Ivan"
|
||||
surname: "Petrov"
|
||||
gender: male
|
||||
birthDate: 4015
|
||||
photo: "png"
|
||||
phoneNumber: "+74951234567\000"
|
||||
isOnline: true
|
||||
visitTime: 1546703100
|
||||
age: 38
|
||||
zodiacSign: capricorn
|
||||
songs: "Yesterday"
|
||||
songs: "Flowers"
|
||||
color: 255
|
||||
color: 0
|
||||
color: 0
|
||||
hometown: "Moscow"
|
||||
location: 55.7532158
|
||||
location: 37.6225052
|
||||
pi: 3.14
|
||||
lotteryWin: 214.1
|
||||
someRatio: 0.1
|
||||
temperature: 5.8
|
||||
randomBigNumber: 17060000000
|
||||
MeasureUnits {
|
||||
coef: 1
|
||||
coef: 0.01
|
||||
coef: 1000
|
||||
unit: "meter"
|
||||
unit: "centimeter"
|
||||
unit: "kilometer"
|
||||
}
|
||||
Nestiness {
|
||||
A {
|
||||
b {
|
||||
C {
|
||||
d: 500
|
||||
e: 501
|
||||
e: 502
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
MESSAGE #2 AT 0x000000F5
|
||||
uuid: "c694ad8a-f714-4ea3-907d-fd54fb25d9b5"
|
||||
name: "Natalia"
|
||||
surname: "Sokolova"
|
||||
gender: female
|
||||
birthDate: 8102
|
||||
photo: "jpg"
|
||||
isOnline: false
|
||||
age: 26
|
||||
zodiacSign: pisces
|
||||
color: 100
|
||||
color: 200
|
||||
color: 50
|
||||
hometown: "Plymouth"
|
||||
location: 50.4037247
|
||||
location: -4.14212322
|
||||
pi: 3.14159
|
||||
someRatio: 0.007
|
||||
temperature: 5.4
|
||||
randomBigNumber: -20000000000000
|
||||
MESSAGE #3 AT 0x0000017A
|
||||
uuid: "a7da1aa6-f425-4789-8947-b034786ed374"
|
||||
name: "Vasily"
|
||||
surname: "Sidorov"
|
||||
gender: male
|
||||
birthDate: 9339
|
||||
photo: "bmp"
|
||||
phoneNumber: "+442012345678"
|
||||
isOnline: true
|
||||
visitTime: 1546117200
|
||||
age: 23
|
||||
zodiacSign: leo
|
||||
songs: "Sunny"
|
||||
color: 250
|
||||
color: 244
|
||||
color: 10
|
||||
hometown: "Murmansk"
|
||||
location: 68.9706802
|
||||
location: 33.0749817
|
||||
pi: 3.14159265358979
|
||||
lotteryWin: 100000000000
|
||||
someRatio: 800
|
||||
temperature: -3.2
|
||||
randomBigNumber: 154400000
|
||||
MeasureUnits {
|
||||
coef: 16
|
||||
unit: "pound"
|
||||
}
|
||||
Nestiness {
|
||||
A {
|
||||
b {
|
||||
C {
|
||||
d: 503
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Binary representation is as expected
|
||||
|
||||
Roundtrip:
|
||||
a7522158-3d41-4b77-ad69-6c598ee55c49 Ivan Petrov male 1980-12-29 png +74951234567\0 1 2019-01-05 18:45:00 38 capricorn ['Yesterday','Flowers'] [255,0,0] Moscow [55.753216,37.622504] 3.14 214.10 0.1 5.8 17060000000 ['meter','centimeter','kilometer'] [1,0.01,1000] 500 [501,502]
|
||||
c694ad8a-f714-4ea3-907d-fd54fb25d9b5 Natalia Sokolova female 1992-03-08 jpg \N 0 \N 26 pisces [] [100,200,50] Plymouth [50.403724,-4.142123] 3.14159 \N 0.007 5.4 -20000000000000 [] [] \N []
|
||||
a7da1aa6-f425-4789-8947-b034786ed374 Vasily Sidorov male 1995-07-28 bmp +442012345678 1 2018-12-30 00:00:00 23 leo ['Sunny'] [250,244,10] Murmansk [68.970680,33.074982] 3.14159265358979 100000000000.00 800 -3.2 154400000 ['pound'] [16] 503 []
|
118
tests/queries/0_stateless/00825_protobuf_format_persons.sh
Executable file
118
tests/queries/0_stateless/00825_protobuf_format_persons.sh
Executable file
@ -0,0 +1,118 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# To generate reference file for this test use the following commands:
|
||||
# ninja ProtobufDelimitedMessagesSerializer
|
||||
# build/utils/test-data-generator/ProtobufDelimitedMessagesSerializer
|
||||
|
||||
CURDIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
|
||||
SCHEMADIR=$CURDIR/format_schemas
|
||||
# shellcheck source=../shell_config.sh
|
||||
. "$CURDIR"/../shell_config.sh
|
||||
|
||||
set -eo pipefail
|
||||
|
||||
# Run the client.
|
||||
$CLICKHOUSE_CLIENT --multiquery <<EOF
|
||||
DROP TABLE IF EXISTS persons_00825;
|
||||
DROP TABLE IF EXISTS roundtrip_persons_00825;
|
||||
DROP TABLE IF EXISTS alt_persons_00825;
|
||||
DROP TABLE IF EXISTS str_persons_00825;
|
||||
DROP TABLE IF EXISTS syntax2_persons_00825;
|
||||
|
||||
CREATE TABLE persons_00825 (uuid UUID,
|
||||
name String,
|
||||
surname String,
|
||||
gender Enum8('male'=1, 'female'=0),
|
||||
birthDate Date,
|
||||
photo Nullable(String),
|
||||
phoneNumber Nullable(FixedString(13)),
|
||||
isOnline UInt8,
|
||||
visitTime Nullable(DateTime),
|
||||
age UInt8,
|
||||
zodiacSign Enum16('aries'=321, 'taurus'=420, 'gemini'=521, 'cancer'=621, 'leo'=723, 'virgo'=823,
|
||||
'libra'=923, 'scorpius'=1023, 'sagittarius'=1122, 'capricorn'=1222, 'aquarius'=120,
|
||||
'pisces'=219),
|
||||
songs Array(String),
|
||||
color Array(UInt8),
|
||||
hometown LowCardinality(String),
|
||||
location Array(Decimal32(6)),
|
||||
pi Nullable(Float64),
|
||||
lotteryWin Nullable(Decimal64(2)),
|
||||
someRatio Float32,
|
||||
temperature Decimal32(1),
|
||||
randomBigNumber Int64,
|
||||
measureUnits Nested(unit String, coef Float32),
|
||||
nestiness_a_b_c_d Nullable(UInt32),
|
||||
\`nestiness_a_B.c_E\` Array(UInt32)
|
||||
) ENGINE = MergeTree ORDER BY tuple();
|
||||
|
||||
INSERT INTO persons_00825 VALUES (toUUID('a7522158-3d41-4b77-ad69-6c598ee55c49'), 'Ivan', 'Petrov', 'male', toDate('1980-12-29'), 'png', '+74951234567', 1, toDateTime('2019-01-05 18:45:00'), 38, 'capricorn', ['Yesterday', 'Flowers'], [255, 0, 0], 'Moscow', [55.753215, 37.622504], 3.14, 214.10, 0.1, 5.8, 17060000000, ['meter', 'centimeter', 'kilometer'], [1, 0.01, 1000], 500, [501, 502]);
|
||||
INSERT INTO persons_00825 VALUES (toUUID('c694ad8a-f714-4ea3-907d-fd54fb25d9b5'), 'Natalia', 'Sokolova', 'female', toDate('1992-03-08'), 'jpg', NULL, 0, NULL, 26, 'pisces', [], [100, 200, 50], 'Plymouth', [50.403724, -4.142123], 3.14159, NULL, 0.007, 5.4, -20000000000000, [], [], NULL, []);
|
||||
INSERT INTO persons_00825 VALUES (toUUID('a7da1aa6-f425-4789-8947-b034786ed374'), 'Vasily', 'Sidorov', 'male', toDate('1995-07-28'), 'bmp', '+442012345678', 1, toDateTime('2018-12-30 00:00:00'), 23, 'leo', ['Sunny'], [250, 244, 10], 'Murmansk', [68.970682, 33.074981], 3.14159265358979, 100000000000, 800, -3.2, 154400000, ['pound'], [16], 503, []);
|
||||
|
||||
SELECT * FROM persons_00825 ORDER BY name;
|
||||
EOF
|
||||
|
||||
# Use schema 00825_protobuf_format_persons:Person
|
||||
echo
|
||||
echo "Schema 00825_protobuf_format_persons:Person"
|
||||
BINARY_FILE_PATH=$(mktemp "$CURDIR/00825_protobuf_format_persons.XXXXXX.binary")
|
||||
$CLICKHOUSE_CLIENT --query "SELECT * FROM persons_00825 ORDER BY name FORMAT Protobuf SETTINGS format_schema = '$SCHEMADIR/00825_protobuf_format_persons:Person'" > $BINARY_FILE_PATH
|
||||
echo
|
||||
$CURDIR/helpers/protobuf_length_delimited_encoder.py --decode_and_check --format_schema "$SCHEMADIR/00825_protobuf_format_persons:Person" --input "$BINARY_FILE_PATH"
|
||||
echo
|
||||
echo "Roundtrip:"
|
||||
$CLICKHOUSE_CLIENT --query "CREATE TABLE roundtrip_persons_00825 AS persons_00825"
|
||||
$CLICKHOUSE_CLIENT --query "INSERT INTO roundtrip_persons_00825 FORMAT Protobuf SETTINGS format_schema='$SCHEMADIR/00825_protobuf_format_persons:Person'" < "$BINARY_FILE_PATH"
|
||||
$CLICKHOUSE_CLIENT --query "SELECT * FROM roundtrip_persons_00825 ORDER BY name"
|
||||
rm "$BINARY_FILE_PATH"
|
||||
|
||||
# Use schema 00825_protobuf_format_persons:AltPerson
|
||||
echo
|
||||
echo "Schema 00825_protobuf_format_persons:AltPerson"
|
||||
BINARY_FILE_PATH=$(mktemp "$CURDIR/00825_protobuf_format_persons.XXXXXX.binary")
|
||||
$CLICKHOUSE_CLIENT --query "SELECT * FROM persons_00825 ORDER BY name FORMAT Protobuf SETTINGS format_schema = '$SCHEMADIR/00825_protobuf_format_persons:AltPerson'" > $BINARY_FILE_PATH
|
||||
echo
|
||||
$CURDIR/helpers/protobuf_length_delimited_encoder.py --decode_and_check --format_schema "$SCHEMADIR/00825_protobuf_format_persons:AltPerson" --input "$BINARY_FILE_PATH"
|
||||
echo
|
||||
echo "Roundtrip:"
|
||||
$CLICKHOUSE_CLIENT --query "CREATE TABLE alt_persons_00825 AS persons_00825"
|
||||
$CLICKHOUSE_CLIENT --query "INSERT INTO alt_persons_00825 FORMAT Protobuf SETTINGS format_schema='$SCHEMADIR/00825_protobuf_format_persons:AltPerson'" < "$BINARY_FILE_PATH"
|
||||
$CLICKHOUSE_CLIENT --query "SELECT * FROM alt_persons_00825 ORDER BY name"
|
||||
rm "$BINARY_FILE_PATH"
|
||||
|
||||
# Use schema 00825_protobuf_format_persons:StrPerson
|
||||
echo
|
||||
echo "Schema 00825_protobuf_format_persons:StrPerson"
|
||||
BINARY_FILE_PATH=$(mktemp "$CURDIR/00825_protobuf_format_persons.XXXXXX.binary")
|
||||
$CLICKHOUSE_CLIENT --query "SELECT * FROM persons_00825 ORDER BY name FORMAT Protobuf SETTINGS format_schema = '$SCHEMADIR/00825_protobuf_format_persons:StrPerson'" > $BINARY_FILE_PATH
|
||||
echo
|
||||
$CURDIR/helpers/protobuf_length_delimited_encoder.py --decode_and_check --format_schema "$SCHEMADIR/00825_protobuf_format_persons:StrPerson" --input "$BINARY_FILE_PATH"
|
||||
echo
|
||||
echo "Roundtrip:"
|
||||
$CLICKHOUSE_CLIENT --query "CREATE TABLE str_persons_00825 AS persons_00825"
|
||||
$CLICKHOUSE_CLIENT --query "INSERT INTO str_persons_00825 FORMAT Protobuf SETTINGS format_schema='$SCHEMADIR/00825_protobuf_format_persons:StrPerson'" < "$BINARY_FILE_PATH"
|
||||
$CLICKHOUSE_CLIENT --query "SELECT * FROM str_persons_00825 ORDER BY name"
|
||||
rm "$BINARY_FILE_PATH"
|
||||
|
||||
# Use schema 00825_protobuf_format_syntax2:Syntax2Person
|
||||
echo
|
||||
echo "Schema 00825_protobuf_format_syntax2:Syntax2Person"
|
||||
BINARY_FILE_PATH=$(mktemp "$CURDIR/00825_protobuf_format_persons.XXXXXX.binary")
|
||||
$CLICKHOUSE_CLIENT --query "SELECT * FROM persons_00825 ORDER BY name FORMAT Protobuf SETTINGS format_schema = '$SCHEMADIR/00825_protobuf_format_persons_syntax2:Syntax2Person'" > $BINARY_FILE_PATH
|
||||
echo
|
||||
$CURDIR/helpers/protobuf_length_delimited_encoder.py --decode_and_check --format_schema "$SCHEMADIR/00825_protobuf_format_persons_syntax2:Syntax2Person" --input "$BINARY_FILE_PATH"
|
||||
echo
|
||||
echo "Roundtrip:"
|
||||
$CLICKHOUSE_CLIENT --query "CREATE TABLE syntax2_persons_00825 AS persons_00825"
|
||||
$CLICKHOUSE_CLIENT --query "INSERT INTO syntax2_persons_00825 FORMAT Protobuf SETTINGS format_schema='$SCHEMADIR/00825_protobuf_format_persons_syntax2:Syntax2Person'" < "$BINARY_FILE_PATH"
|
||||
$CLICKHOUSE_CLIENT --query "SELECT * FROM syntax2_persons_00825 ORDER BY name"
|
||||
rm "$BINARY_FILE_PATH"
|
||||
|
||||
$CLICKHOUSE_CLIENT --multiquery <<EOF
|
||||
DROP TABLE persons_00825;
|
||||
DROP TABLE roundtrip_persons_00825;
|
||||
DROP TABLE alt_persons_00825;
|
||||
DROP TABLE str_persons_00825;
|
||||
DROP TABLE syntax2_persons_00825;
|
||||
EOF
|
@ -0,0 +1,24 @@
|
||||
2 4
|
||||
0 0
|
||||
3 9
|
||||
|
||||
Binary representation:
|
||||
00000000 04 08 02 10 04 00 04 08 03 10 09 |...........|
|
||||
0000000b
|
||||
|
||||
MESSAGE #1 AT 0x00000001
|
||||
number: 2
|
||||
square: 4
|
||||
MESSAGE #2 AT 0x00000006
|
||||
MESSAGE #3 AT 0x00000007
|
||||
number: 3
|
||||
square: 9
|
||||
|
||||
Binary representation is as expected
|
||||
|
||||
2 4
|
||||
0 0
|
||||
3 9
|
||||
2 4
|
||||
0 0
|
||||
3 9
|
34
tests/queries/0_stateless/00825_protobuf_format_squares.sh
Executable file
34
tests/queries/0_stateless/00825_protobuf_format_squares.sh
Executable file
@ -0,0 +1,34 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
CURDIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
|
||||
SCHEMADIR=$CURDIR/format_schemas
|
||||
# shellcheck source=../shell_config.sh
|
||||
. "$CURDIR"/../shell_config.sh
|
||||
|
||||
set -eo pipefail
|
||||
|
||||
# Run the client.
|
||||
$CLICKHOUSE_CLIENT --multiquery <<EOF
|
||||
DROP TABLE IF EXISTS squares_protobuf_00825;
|
||||
|
||||
CREATE TABLE squares_protobuf_00825 (number UInt32, square UInt64) ENGINE = MergeTree ORDER BY tuple();
|
||||
|
||||
INSERT INTO squares_protobuf_00825 VALUES (2, 4), (0, 0), (3, 9);
|
||||
|
||||
SELECT * FROM squares_protobuf_00825;
|
||||
EOF
|
||||
|
||||
BINARY_FILE_PATH=$(mktemp "$CURDIR/00825_protobuf_format_nested_optional.XXXXXX.binary")
|
||||
$CLICKHOUSE_CLIENT --query "SELECT * FROM squares_protobuf_00825 FORMAT Protobuf SETTINGS format_schema = '$SCHEMADIR/00825_protobuf_format_squares:NumberAndSquare'" > "$BINARY_FILE_PATH"
|
||||
|
||||
# Check the output in the protobuf format
|
||||
echo
|
||||
$CURDIR/helpers/protobuf_length_delimited_encoder.py --decode_and_check --format_schema "$SCHEMADIR/00825_protobuf_format_squares:NumberAndSquare" --input "$BINARY_FILE_PATH"
|
||||
|
||||
# Check the input in the protobuf format (now the table contains the same data twice).
|
||||
echo
|
||||
$CLICKHOUSE_CLIENT --query "INSERT INTO squares_protobuf_00825 FORMAT Protobuf SETTINGS format_schema='$SCHEMADIR/00825_protobuf_format_squares:NumberAndSquare'" < "$BINARY_FILE_PATH"
|
||||
$CLICKHOUSE_CLIENT --query "SELECT * FROM squares_protobuf_00825"
|
||||
|
||||
rm "$BINARY_FILE_PATH"
|
||||
$CLICKHOUSE_CLIENT --query "DROP TABLE squares_protobuf_00825"
|
@ -1,13 +1,14 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
CURDIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
|
||||
SCHEMADIR=$CURDIR/format_schemas
|
||||
# shellcheck source=../shell_config.sh
|
||||
. "$CURDIR"/../shell_config.sh
|
||||
|
||||
set -eo pipefail
|
||||
|
||||
# Run the client.
|
||||
$CLICKHOUSE_CLIENT --multiquery <<'EOF'
|
||||
$CLICKHOUSE_CLIENT --multiquery <<EOF
|
||||
DROP TABLE IF EXISTS table_default_protobuf_00825;
|
||||
|
||||
CREATE TABLE table_default_protobuf_00825
|
||||
@ -24,15 +25,16 @@ SELECT * FROM table_default_protobuf_00825 ORDER BY x,y,z;
|
||||
EOF
|
||||
|
||||
BINARY_FILE_PATH=$(mktemp "$CURDIR/00825_protobuf_format_table_default.XXXXXX.binary")
|
||||
$CLICKHOUSE_CLIENT --query "SELECT * FROM table_default_protobuf_00825 ORDER BY x,y,z FORMAT Protobuf SETTINGS format_schema = '$CURDIR/00825_protobuf_format_table_default:Message'" > "$BINARY_FILE_PATH"
|
||||
$CLICKHOUSE_CLIENT --query "SELECT * FROM table_default_protobuf_00825 ORDER BY x,y,z FORMAT Protobuf SETTINGS format_schema = '$SCHEMADIR/00825_protobuf_format_table_default:Message'" > "$BINARY_FILE_PATH"
|
||||
|
||||
# Check the output in the protobuf format
|
||||
echo
|
||||
$CURDIR/helpers/protobuf_length_delimited_encoder.py --decode_and_check --format_schema "$CURDIR/00825_protobuf_format_table_default:Message" --input "$BINARY_FILE_PATH"
|
||||
$CURDIR/helpers/protobuf_length_delimited_encoder.py --decode_and_check --format_schema "$SCHEMADIR/00825_protobuf_format_table_default:Message" --input "$BINARY_FILE_PATH"
|
||||
|
||||
# Check the input in the protobuf format (now the table contains the same data twice).
|
||||
echo
|
||||
$CLICKHOUSE_CLIENT --query "INSERT INTO table_default_protobuf_00825 FORMAT Protobuf SETTINGS format_schema='$CURDIR/00825_protobuf_format_table_default:Message'" < "$BINARY_FILE_PATH"
|
||||
$CLICKHOUSE_CLIENT --query "INSERT INTO table_default_protobuf_00825 FORMAT Protobuf SETTINGS format_schema='$SCHEMADIR/00825_protobuf_format_table_default:Message'" < "$BINARY_FILE_PATH"
|
||||
$CLICKHOUSE_CLIENT --query "SELECT * FROM table_default_protobuf_00825 ORDER BY x,y,z"
|
||||
|
||||
rm "$BINARY_FILE_PATH"
|
||||
$CLICKHOUSE_CLIENT --query "DROP TABLE table_default_protobuf_00825"
|
||||
|
@ -6,6 +6,8 @@ lisi
|
||||
female
|
||||
zhangsan
|
||||
gender
|
||||
2020-01-01 {1:0,2:1}
|
||||
2020-01-01 {1:0,2:-1}
|
||||
1116
|
||||
1117
|
||||
1118
|
||||
|
@ -22,7 +22,21 @@ select a[b] from table_map;
|
||||
select b from table_map where a = map('name','lisi', 'gender', 'female');
|
||||
drop table if exists table_map;
|
||||
|
||||
-- Int type
|
||||
-- Big Integer type
|
||||
|
||||
create table table_map (d DATE, m Map(Int8, UInt256)) ENGINE = MergeTree() order by d;
|
||||
insert into table_map values ('2020-01-01', map(1, 0, 2, 1));
|
||||
select * from table_map;
|
||||
drop table table_map;
|
||||
|
||||
-- Integer type
|
||||
|
||||
create table table_map (d DATE, m Map(Int8, Int8)) ENGINE = MergeTree() order by d;
|
||||
insert into table_map values ('2020-01-01', map(1, 0, 2, -1));
|
||||
select * from table_map;
|
||||
drop table table_map;
|
||||
|
||||
-- Unsigned Int type
|
||||
drop table if exists table_map;
|
||||
create table table_map(a Map(UInt8, UInt64), b UInt8) Engine = MergeTree() order by b;
|
||||
insert into table_map select map(number, number+5), number from numbers(1111,4);
|
||||
|
@ -1,8 +1,8 @@
|
||||
2 worl [123,1,1] 49 \N 50 4950 Nullable(UInt64) 50
|
||||
2 worl [123,1,1] 49 \N 50 4950 Nullable(UInt64) 50
|
||||
2 worl 1 1 0 4950 99 [123,1,1] 49 \N 50 4950 Nullable(UInt64) 50
|
||||
2 worl 1 1 0 4950 99 [123,1,1] 49 \N 50 4950 Nullable(UInt64) 50
|
||||
|
||||
arraySort(used_aggregate_functions)
|
||||
['avg','count','groupBitAnd','sum','uniq']
|
||||
['avg','count','groupBitAnd','max','sum','uniq']
|
||||
|
||||
arraySort(used_aggregate_function_combinators)
|
||||
['Array','If','OrDefault','OrNull']
|
||||
@ -11,7 +11,7 @@ arraySort(used_table_functions)
|
||||
['numbers']
|
||||
|
||||
arraySort(used_functions)
|
||||
['CAST','addDays','array','arrayFlatten','modulo','plus','substring','toDate','toDayOfYear','toTypeName','toWeek']
|
||||
['CAST','CRC32','addDays','array','arrayFlatten','modulo','plus','pow','round','substring','tanh','toDate','toDayOfYear','toTypeName','toWeek']
|
||||
|
||||
arraySort(used_data_type_families)
|
||||
['Array','Int32','Nullable','String']
|
||||
@ -20,5 +20,5 @@ used_database_engines
|
||||
['Atomic']
|
||||
|
||||
arraySort(used_data_type_families) used_storages
|
||||
['DateTime','Int64'] ['Memory']
|
||||
['Int64','datetime'] ['Memory']
|
||||
|
||||
|
@ -2,6 +2,8 @@ SET database_atomic_wait_for_drop_and_detach_synchronously=1;
|
||||
|
||||
SELECT uniqArray([1, 1, 2]),
|
||||
SUBSTRING('Hello, world', 7, 5),
|
||||
POW(1, 2), ROUND(TANh(1)), CrC32(''),
|
||||
SUM(number), MAX(number),
|
||||
flatten([[[BIT_AND(123)]], [[mod(3, 2)], [CAST('1' AS INTEGER)]]]),
|
||||
week(toDate('2000-12-05')),
|
||||
CAST(arrayJoin([NULL, NULL]) AS Nullable(TEXT)),
|
||||
@ -49,7 +51,7 @@ WHERE current_database = currentDatabase() AND type == 'QueryFinish' AND (query
|
||||
ORDER BY query_start_time DESC LIMIT 1 FORMAT TabSeparatedWithNames;
|
||||
SELECT '';
|
||||
|
||||
CREATE OR REPLACE TABLE test_query_log_factories_info1.memory_table (id BIGINT, date DateTime) ENGINE=Memory();
|
||||
CREATE OR REPLACE TABLE test_query_log_factories_info1.memory_table (id BIGINT, date DATETIME) ENGINE=Memory();
|
||||
|
||||
SYSTEM FLUSH LOGS;
|
||||
SELECT arraySort(used_data_type_families), used_storages
|
||||
|
@ -0,0 +1,15 @@
|
||||
Tuple
|
||||
(0,1)
|
||||
(0,1)
|
||||
Tuple nested in Array
|
||||
[(0,2),(3,0),(0,4)]
|
||||
[(0,2),(3,0),(0,4)]
|
||||
Tuple nested in Array nested in Tuple
|
||||
(0,[(0,2),(3,0),(0,4)])
|
||||
(0,[(0,2),(3,0),(0,4)])
|
||||
Tuple nested in Map
|
||||
{'test':(0,1)}
|
||||
{'test':(0,1)}
|
||||
Tuple nested in Map nested in Tuple
|
||||
(0,{'test':(0,1)})
|
||||
(0,{'test':(0,1)})
|
@ -0,0 +1,77 @@
|
||||
SELECT 'Tuple';
|
||||
|
||||
DROP TABLE IF EXISTS test_tuple;
|
||||
CREATE TABLE test_tuple (value Tuple(UInt8, UInt8)) ENGINE=TinyLog;
|
||||
|
||||
SET input_format_null_as_default = 1;
|
||||
INSERT INTO test_tuple VALUES ((NULL, 1));
|
||||
SELECT * FROM test_tuple;
|
||||
|
||||
SET input_format_null_as_default = 0;
|
||||
INSERT INTO test_tuple VALUES ((NULL, 2)); -- { clientError 53 }
|
||||
SELECT * FROM test_tuple;
|
||||
|
||||
DROP TABLE test_tuple;
|
||||
|
||||
SELECT 'Tuple nested in Array';
|
||||
|
||||
DROP TABLE IF EXISTS test_tuple_nested_in_array;
|
||||
CREATE TABLE test_tuple_nested_in_array (value Array(Tuple(UInt8, UInt8))) ENGINE=TinyLog;
|
||||
|
||||
SET input_format_null_as_default = 1;
|
||||
INSERT INTO test_tuple_nested_in_array VALUES ([(NULL, 2), (3, NULL), (NULL, 4)]);
|
||||
SELECT * FROM test_tuple_nested_in_array;
|
||||
|
||||
SET input_format_null_as_default = 0;
|
||||
INSERT INTO test_tuple_nested_in_array VALUES ([(NULL, 1)]); -- { clientError 53 }
|
||||
SELECT * FROM test_tuple_nested_in_array;
|
||||
|
||||
DROP TABLE test_tuple_nested_in_array;
|
||||
|
||||
SELECT 'Tuple nested in Array nested in Tuple';
|
||||
|
||||
DROP TABLE IF EXISTS test_tuple_nested_in_array_nested_in_tuple;
|
||||
CREATE TABLE test_tuple_nested_in_array_nested_in_tuple (value Tuple(UInt8, Array(Tuple(UInt8, UInt8)))) ENGINE=TinyLog;
|
||||
|
||||
SET input_format_null_as_default = 1;
|
||||
INSERT INTO test_tuple_nested_in_array_nested_in_tuple VALUES ( (NULL, [(NULL, 2), (3, NULL), (NULL, 4)]) );
|
||||
SELECT * FROM test_tuple_nested_in_array_nested_in_tuple;
|
||||
|
||||
SET input_format_null_as_default = 0;
|
||||
INSERT INTO test_tuple_nested_in_array_nested_in_tuple VALUES ( (NULL, [(NULL, 1)]) ); -- { clientError 53 }
|
||||
SELECT * FROM test_tuple_nested_in_array_nested_in_tuple;
|
||||
|
||||
DROP TABLE test_tuple_nested_in_array_nested_in_tuple;
|
||||
|
||||
SELECT 'Tuple nested in Map';
|
||||
|
||||
SET allow_experimental_map_type = 1;
|
||||
|
||||
DROP TABLE IF EXISTS test_tuple_nested_in_map;
|
||||
CREATE TABLE test_tuple_nested_in_map (value Map(String, Tuple(UInt8, UInt8))) ENGINE=TinyLog;
|
||||
|
||||
SET input_format_null_as_default = 1;
|
||||
INSERT INTO test_tuple_nested_in_map VALUES (map('test', (NULL, 1)));
|
||||
|
||||
SELECT * FROM test_tuple_nested_in_map;
|
||||
|
||||
SET input_format_null_as_default = 0;
|
||||
INSERT INTO test_tuple_nested_in_map VALUES (map('test', (NULL, 1))); -- { clientError 53 }
|
||||
SELECT * FROM test_tuple_nested_in_map;
|
||||
|
||||
DROP TABLE test_tuple_nested_in_map;
|
||||
|
||||
SELECT 'Tuple nested in Map nested in Tuple';
|
||||
|
||||
DROP TABLE IF EXISTS test_tuple_nested_in_map_nested_in_tuple;
|
||||
CREATE TABLE test_tuple_nested_in_map_nested_in_tuple (value Tuple(UInt8, Map(String, Tuple(UInt8, UInt8)))) ENGINE=TinyLog;
|
||||
|
||||
SET input_format_null_as_default = 1;
|
||||
INSERT INTO test_tuple_nested_in_map_nested_in_tuple VALUES ( (NULL, map('test', (NULL, 1))) );
|
||||
SELECT * FROM test_tuple_nested_in_map_nested_in_tuple;
|
||||
|
||||
SET input_format_null_as_default = 0;
|
||||
INSERT INTO test_tuple_nested_in_map_nested_in_tuple VALUES ( (NULL, map('test', (NULL, 1))) ); -- { clientError 53 }
|
||||
SELECT * FROM test_tuple_nested_in_map_nested_in_tuple;
|
||||
|
||||
DROP TABLE test_tuple_nested_in_map_nested_in_tuple;
|
@ -0,0 +1,4 @@
|
||||
CREATE TABLE default.bad_conversions\n(\n `a` UInt32\n)\nENGINE = MergeTree\nORDER BY tuple()\nSETTINGS index_granularity = 8192
|
||||
0
|
||||
CREATE TABLE default.bad_conversions_2\n(\n `e` Enum8(\'foo\' = 1, \'bar\' = 2)\n)\nENGINE = MergeTree\nORDER BY tuple()\nSETTINGS index_granularity = 8192
|
||||
0
|
17
tests/queries/0_stateless/01732_alters_bad_conversions.sql
Normal file
17
tests/queries/0_stateless/01732_alters_bad_conversions.sql
Normal file
@ -0,0 +1,17 @@
|
||||
DROP TABLE IF EXISTS bad_conversions;
|
||||
DROP TABLE IF EXISTS bad_conversions_2;
|
||||
|
||||
CREATE TABLE bad_conversions (a UInt32) ENGINE = MergeTree ORDER BY tuple();
|
||||
INSERT INTO bad_conversions VALUES (1);
|
||||
ALTER TABLE bad_conversions MODIFY COLUMN a Array(String); -- { serverError 53 }
|
||||
SHOW CREATE TABLE bad_conversions;
|
||||
SELECT count() FROM system.mutations WHERE table = 'bad_conversions' AND database = currentDatabase();
|
||||
|
||||
CREATE TABLE bad_conversions_2 (e Enum('foo' = 1, 'bar' = 2)) ENGINE = MergeTree ORDER BY tuple();
|
||||
INSERT INTO bad_conversions_2 VALUES (1);
|
||||
ALTER TABLE bad_conversions_2 MODIFY COLUMN e Enum('bar' = 1, 'foo' = 2); -- { serverError 70 }
|
||||
SHOW CREATE TABLE bad_conversions_2;
|
||||
SELECT count() FROM system.mutations WHERE table = 'bad_conversions_2' AND database = currentDatabase();
|
||||
|
||||
DROP TABLE IF EXISTS bad_conversions;
|
||||
DROP TABLE IF EXISTS bad_conversions_2;
|
@ -0,0 +1 @@
|
||||
yyy
|
@ -0,0 +1,9 @@
|
||||
drop table if exists join_tbl;
|
||||
|
||||
create table join_tbl (`id` String, `name` String) engine Join(any, left, id);
|
||||
|
||||
insert into join_tbl values ('xxx', 'yyy');
|
||||
|
||||
select joinGet('join_tbl', 'name', toLowCardinality('xxx'));
|
||||
|
||||
drop table if exists join_tbl;
|
@ -0,0 +1,2 @@
|
||||
A
|
||||
\N
|
5
tests/queries/0_stateless/01736_null_as_default.sql
Normal file
5
tests/queries/0_stateless/01736_null_as_default.sql
Normal file
@ -0,0 +1,5 @@
|
||||
drop table if exists test_num;
|
||||
create table test_enum (c Nullable(Enum16('A' = 1, 'B' = 2))) engine Log;
|
||||
insert into test_enum values (1), (NULL);
|
||||
select * from test_enum;
|
||||
drop table if exists test_num;
|
@ -0,0 +1,3 @@
|
||||
{1:'Ready',2:'Steady',3:'Go'}
|
||||
{1:'Ready',2:'Steady',3:'Go'}
|
||||
{1:'Ready',2:'Steady',3:'Go'}
|
@ -0,0 +1,3 @@
|
||||
SELECT CAST((['1', '2', '3'], ['Ready', 'Steady', 'Go']), 'Map(UInt8, String)') AS map;
|
||||
SELECT CAST((['1', '2', '3'], ['Ready', 'Steady', 'Go']), 'Map(UInt8, String)') AS map;
|
||||
SELECT CAST((['1', '2', '3'], ['Ready', 'Steady', 'Go']), 'Map(UInt8, String)') AS map;
|
@ -0,0 +1,11 @@
|
||||
syntax = "proto3";
|
||||
|
||||
message MessageType {
|
||||
message XType {
|
||||
message YType {
|
||||
int32 z=3;
|
||||
};
|
||||
repeated YType y=2;
|
||||
};
|
||||
repeated XType x=1;
|
||||
};
|
@ -0,0 +1,6 @@
|
||||
syntax = "proto3";
|
||||
|
||||
message Message {
|
||||
int32 x = 1;
|
||||
string str = 2;
|
||||
};
|
@ -143,9 +143,3 @@ message StrPerson {
|
||||
MeasureUnits measureUnits = 21;
|
||||
NestinessA nestiness_a = 22;
|
||||
};
|
||||
|
||||
message NumberAndSquare
|
||||
{
|
||||
uint32 number = 1;
|
||||
uint64 square = 2;
|
||||
};
|
@ -0,0 +1,6 @@
|
||||
syntax = "proto3";
|
||||
|
||||
message NumberAndSquare {
|
||||
uint32 number = 1;
|
||||
uint64 square = 2;
|
||||
};
|
@ -0,0 +1,63 @@
|
||||
syntax = "proto2";
|
||||
|
||||
message Syntax2Person {
|
||||
enum Gender {
|
||||
female = 0;
|
||||
male = 1;
|
||||
};
|
||||
|
||||
enum ZodiacSign {
|
||||
aries = 0;
|
||||
taurus = 1;
|
||||
gemini = 2;
|
||||
cancer = 3;
|
||||
leo = 4;
|
||||
virgo = 5;
|
||||
libra = 6;
|
||||
scorpius = 7;
|
||||
sagittarius = 8;
|
||||
capricorn = 9;
|
||||
aquarius = 10;
|
||||
pisces = 11;
|
||||
};
|
||||
|
||||
required string uuid = 1;
|
||||
required string name = 2;
|
||||
required string surname = 3;
|
||||
required Gender gender = 4;
|
||||
required uint32 birthDate = 5;
|
||||
optional bytes photo = 6;
|
||||
optional string phoneNumber = 7;
|
||||
optional bool isOnline = 8;
|
||||
optional fixed32 visitTime = 9;
|
||||
optional uint32 age = 10;
|
||||
optional ZodiacSign zodiacSign = 11;
|
||||
repeated string songs = 12;
|
||||
repeated uint32 color = 13;
|
||||
optional string hometown = 14 [default='Moscow'];
|
||||
repeated float location = 15 [packed=true];
|
||||
optional double pi = 16;
|
||||
optional double lotteryWin = 17;
|
||||
optional float someRatio = 18;
|
||||
optional float temperature = 19;
|
||||
optional sint64 randomBigNumber = 20;
|
||||
optional group MeasureUnits = 21 {
|
||||
repeated float coef = 1;
|
||||
repeated string unit = 2;
|
||||
};
|
||||
optional group Nestiness = 22
|
||||
{
|
||||
optional group A = 1 {
|
||||
message SubB {
|
||||
optional group C = 1 {
|
||||
optional uint32 d = 1;
|
||||
repeated uint32 e = 2;
|
||||
};
|
||||
};
|
||||
optional SubB b = 100;
|
||||
};
|
||||
};
|
||||
optional string newFieldStr = 23 [default='abc'];
|
||||
optional int32 newFieldInt = 24 [default=-11];
|
||||
optional bool newBool = 25 [default=true];
|
||||
};
|
@ -12,18 +12,18 @@ import tempfile
|
||||
|
||||
def read_varint(input):
|
||||
res = 0
|
||||
shift = 0
|
||||
multiplier = 1
|
||||
while True:
|
||||
c = input.read(1)
|
||||
if len(c) == 0:
|
||||
return None
|
||||
b = c[0]
|
||||
if b < 0x80:
|
||||
res += b << shift
|
||||
res += b * multiplier
|
||||
break
|
||||
b -= 0x80
|
||||
res += b << shift
|
||||
shift = shift << 7
|
||||
res += b * multiplier
|
||||
multiplier *= 0x80
|
||||
return res
|
||||
|
||||
def write_varint(output, value):
|
||||
|
@ -281,13 +281,16 @@
|
||||
"00746_sql_fuzzy",
|
||||
"00763_create_query_as_table_engine_bug",
|
||||
"00765_sql_compatibility_aliases",
|
||||
"00825_protobuf_format_input",
|
||||
"00825_protobuf_format_nested_optional",
|
||||
"00825_protobuf_format_array_3dim",
|
||||
"00825_protobuf_format_map",
|
||||
"00825_protobuf_format_array_of_arrays",
|
||||
"00825_protobuf_format_table_default",
|
||||
"00825_protobuf_format_enum_mapping",
|
||||
"00825_protobuf_format_map",
|
||||
"00825_protobuf_format_nested_in_nested",
|
||||
"00825_protobuf_format_nested_optional",
|
||||
"00825_protobuf_format_no_length_delimiter",
|
||||
"00825_protobuf_format_persons",
|
||||
"00825_protobuf_format_squares",
|
||||
"00825_protobuf_format_table_default",
|
||||
"00826_cross_to_inner_join",
|
||||
"00834_not_between",
|
||||
"00909_kill_not_initialized_query",
|
||||
|
@ -27,7 +27,6 @@ if (NOT DEFINED ENABLE_UTILS OR ENABLE_UTILS)
|
||||
add_subdirectory (zookeeper-adjust-block-numbers-to-parts)
|
||||
add_subdirectory (wikistat-loader)
|
||||
add_subdirectory (check-marks)
|
||||
add_subdirectory (test-data-generator)
|
||||
add_subdirectory (convert-month-partitioned-parts)
|
||||
add_subdirectory (checksum-for-compressed-block)
|
||||
add_subdirectory (db-generator)
|
||||
|
@ -1,18 +0,0 @@
|
||||
# Disable clang-tidy for protobuf generated files
|
||||
set (CMAKE_CXX_CLANG_TIDY "")
|
||||
|
||||
if (USE_PROTOBUF)
|
||||
protobuf_generate_cpp(ProtobufDelimitedMessagesSerializer_Srcs ProtobufDelimitedMessagesSerializer_Hdrs ${CMAKE_CURRENT_SOURCE_DIR}/../../tests/queries/0_stateless/00825_protobuf_format.proto)
|
||||
protobuf_generate_cpp(ProtobufDelimitedMessagesSerializer_Srcs2 ProtobufDelimitedMessagesSerializer_Hdrs2 ${CMAKE_CURRENT_SOURCE_DIR}/../../tests/queries/0_stateless/00825_protobuf_format_syntax2.proto)
|
||||
add_executable (ProtobufDelimitedMessagesSerializer ProtobufDelimitedMessagesSerializer.cpp ${ProtobufDelimitedMessagesSerializer_Srcs} ${ProtobufDelimitedMessagesSerializer_Hdrs} ${ProtobufDelimitedMessagesSerializer_Srcs2} ${ProtobufDelimitedMessagesSerializer_Hdrs2})
|
||||
target_include_directories (ProtobufDelimitedMessagesSerializer SYSTEM BEFORE PRIVATE ${Protobuf_INCLUDE_DIR} ${CMAKE_CURRENT_BINARY_DIR})
|
||||
target_link_libraries (ProtobufDelimitedMessagesSerializer PRIVATE ${Protobuf_LIBRARY} boost::program_options)
|
||||
get_filename_component(ProtobufDelimitedMessagesSerializer_OutputDir "${CMAKE_CURRENT_LIST_DIR}/../../tests/queries/0_stateless" REALPATH)
|
||||
target_compile_definitions(ProtobufDelimitedMessagesSerializer PRIVATE OUTPUT_DIR="${ProtobufDelimitedMessagesSerializer_OutputDir}")
|
||||
|
||||
# Protoc generates substandard code.
|
||||
check_cxx_compiler_flag("-Wsuggest-destructor-override" HAS_SUGGEST_DESTRUCTOR_OVERRIDE)
|
||||
if (HAS_SUGGEST_OVERRIDE)
|
||||
target_compile_options(ProtobufDelimitedMessagesSerializer PRIVATE -Wno-suggest-destructor-override)
|
||||
endif()
|
||||
endif ()
|
@ -1,728 +0,0 @@
|
||||
// Generator of protobuf delimited messages used in the protobuf IO tests
|
||||
// tests/queries/0_stateless/00825_protobuf_format*
|
||||
|
||||
#include <boost/program_options.hpp>
|
||||
#include <fstream>
|
||||
#include <iostream>
|
||||
#include <google/protobuf/util/delimited_message_util.h>
|
||||
#include "00825_protobuf_format.pb.h"
|
||||
#include "00825_protobuf_format_syntax2.pb.h"
|
||||
|
||||
|
||||
void writeInsertDataQueryForInputTest(std::stringstream & delimited_messages, const std::string & table_name, const std::string & format_schema, std::ostream & out) // STYLE_CHECK_ALLOW_STD_STRING_STREAM
|
||||
{
|
||||
out << "echo -ne '";
|
||||
std::string bytes = delimited_messages.str();
|
||||
delimited_messages.str("");
|
||||
for (const char c : bytes)
|
||||
{
|
||||
char buf[5];
|
||||
sprintf(buf, "\\x%02x", static_cast<unsigned char>(c));
|
||||
out << buf;
|
||||
}
|
||||
out << "' | $CLICKHOUSE_CLIENT --query=\"INSERT INTO " << table_name << " FORMAT Protobuf"
|
||||
" SETTINGS format_schema = '$CURDIR/"
|
||||
<< format_schema << "'\"" << std::endl;
|
||||
}
|
||||
|
||||
void writeInsertDataQueriesForInputTest(std::ostream & out)
|
||||
{
|
||||
std::stringstream ss; // STYLE_CHECK_ALLOW_STD_STRING_STREAM
|
||||
{
|
||||
Person person;
|
||||
person.set_uuid("a7522158-3d41-4b77-ad69-6c598ee55c49");
|
||||
person.set_name("Ivan");
|
||||
person.set_surname("Petrov");
|
||||
person.set_gender(Gender::male);
|
||||
person.set_birthdate(4015); // 1980-12-29
|
||||
person.set_photo("png");
|
||||
person.set_phonenumber("+74951234567");
|
||||
person.set_isonline(true);
|
||||
person.set_visittime(1546703100); // 2019-01-05 18:45:00
|
||||
person.set_age(38);
|
||||
person.set_zodiacsign(ZodiacSign::capricorn);
|
||||
person.add_songs("Yesterday");
|
||||
person.add_songs("Flowers");
|
||||
person.add_color(255);
|
||||
person.add_color(0);
|
||||
person.add_color(0);
|
||||
person.set_hometown("Moscow");
|
||||
person.add_location(55.753215);
|
||||
person.add_location(37.622504);
|
||||
person.set_pi(3.14);
|
||||
person.set_lotterywin(214.10);
|
||||
person.set_someratio(0.1);
|
||||
person.set_temperature(5.8);
|
||||
person.set_randombignumber(17060000000);
|
||||
auto* mu = person.add_measureunits();
|
||||
mu->set_unit("meter");
|
||||
mu->set_coef(1);
|
||||
mu = person.add_measureunits();
|
||||
mu->set_unit("centimeter");
|
||||
mu->set_coef(0.01);
|
||||
mu = person.add_measureunits();
|
||||
mu->set_unit("kilometer");
|
||||
mu->set_coef(1000);
|
||||
person.mutable_nestiness()->mutable_a()->mutable_b()->mutable_c()->set_d(500);
|
||||
person.mutable_nestiness()->mutable_a()->mutable_b()->mutable_c()->add_e(501);
|
||||
person.mutable_nestiness()->mutable_a()->mutable_b()->mutable_c()->add_e(502);
|
||||
google::protobuf::util::SerializeDelimitedToOstream(person, &ss);
|
||||
}
|
||||
|
||||
{
|
||||
Person person;
|
||||
person.set_uuid("c694ad8a-f714-4ea3-907d-fd54fb25d9b5");
|
||||
person.set_name("Natalia");
|
||||
person.set_surname("Sokolova");
|
||||
person.set_gender(Gender::female);
|
||||
person.set_birthdate(8102); // 1992-03-08
|
||||
person.set_photo("jpg");
|
||||
person.set_isonline(false);
|
||||
person.set_age(26);
|
||||
person.set_zodiacsign(ZodiacSign::pisces);
|
||||
person.add_color(100);
|
||||
person.add_color(200);
|
||||
person.add_color(50);
|
||||
person.set_hometown("Plymouth");
|
||||
person.add_location(50.403724);
|
||||
person.add_location(-4.142123);
|
||||
person.set_pi(3.14159);
|
||||
person.set_someratio(0.007);
|
||||
person.set_temperature(5.4);
|
||||
person.set_randombignumber(-20000000000000);
|
||||
google::protobuf::util::SerializeDelimitedToOstream(person, &ss);
|
||||
}
|
||||
|
||||
{
|
||||
Person person;
|
||||
person.set_uuid("a7da1aa6-f425-4789-8947-b034786ed374");
|
||||
person.set_name("Vasily");
|
||||
person.set_surname("Sidorov");
|
||||
person.set_gender(Gender::male);
|
||||
person.set_birthdate(9339); // 1995-07-28
|
||||
person.set_photo("bmp");
|
||||
person.set_phonenumber("+442012345678");
|
||||
person.set_isonline(true);
|
||||
person.set_visittime(1546117200); // 2018-12-30 00:00:00
|
||||
person.set_age(23);
|
||||
person.set_zodiacsign(ZodiacSign::leo);
|
||||
person.add_songs("Sunny");
|
||||
person.add_color(250);
|
||||
person.add_color(244);
|
||||
person.add_color(10);
|
||||
person.set_hometown("Murmansk");
|
||||
person.add_location(68.970682);
|
||||
person.add_location(33.074981);
|
||||
person.set_pi(3.14159265358979);
|
||||
person.set_lotterywin(100000000000);
|
||||
person.set_someratio(800);
|
||||
person.set_temperature(-3.2);
|
||||
person.set_randombignumber(154400000);
|
||||
auto* mu = person.add_measureunits();
|
||||
mu->set_unit("pound");
|
||||
mu->set_coef(16);
|
||||
person.mutable_nestiness()->mutable_a()->mutable_b()->mutable_c()->set_d(503);
|
||||
google::protobuf::util::SerializeDelimitedToOstream(person, &ss);
|
||||
}
|
||||
|
||||
writeInsertDataQueryForInputTest(ss, "in_persons_00825", "00825_protobuf_format:Person", out);
|
||||
|
||||
{
|
||||
AltPerson person;
|
||||
person.add_location(42);
|
||||
person.add_location(-88);
|
||||
person.set_pi(3.141);
|
||||
person.set_uuid("20fcd95a-332d-41db-a9ec-161f644d059c");
|
||||
person.set_name("Frida");
|
||||
person.set_gender(AltPerson::female);
|
||||
person.set_zodiacsign(1122); // sagittarius
|
||||
person.set_birthdate(3267); // 1978-12-12
|
||||
person.set_age("40");
|
||||
person.set_isonline(OnlineStatus::offline);
|
||||
person.set_someratio(0.5);
|
||||
person.set_visittime(1363005000); // 2013-03-11 16:30:00
|
||||
person.set_randombignumber(8010000009);
|
||||
person.add_color(110);
|
||||
person.add_color(210);
|
||||
person.add_color(74);
|
||||
person.set_lotterywin(311);
|
||||
person.set_surname("Ermakova");
|
||||
person.set_phonenumber(3124555929);
|
||||
person.set_temperature(10);
|
||||
person.add_measureunits_unit("KB");
|
||||
person.add_measureunits_coef(1024);
|
||||
person.add_measureunits_unit("MB");
|
||||
person.add_measureunits_coef(1048576);
|
||||
person.set_nestiness_a_b_c_d(700);
|
||||
person.add_nestiness_a_b_c_e(701);
|
||||
google::protobuf::util::SerializeDelimitedToOstream(person, &ss);
|
||||
}
|
||||
|
||||
{
|
||||
AltPerson person;
|
||||
person.add_location(26);
|
||||
person.add_location(-80);
|
||||
person.set_pi(3.1416);
|
||||
person.set_uuid("7cfa6856-a54a-4786-b8e5-745159d52278");
|
||||
person.set_name("Isolde");
|
||||
person.set_gender(AltPerson::female);
|
||||
person.set_zodiacsign(120); // aquarius
|
||||
person.set_birthdate(6248); // 1987-02-09
|
||||
person.set_age("32");
|
||||
person.set_isonline(OnlineStatus::online);
|
||||
person.set_someratio(4.5);
|
||||
person.set_randombignumber(-11111111111111);
|
||||
person.add_color(255);
|
||||
person.add_color(0);
|
||||
person.add_color(255);
|
||||
person.set_surname("Lavrova");
|
||||
person.set_temperature(25);
|
||||
person.set_newfieldstr("abc");
|
||||
person.set_newfieldbool(true);
|
||||
person.add_newfieldint(44);
|
||||
person.add_measureunits_unit("Byte");
|
||||
person.add_measureunits_coef(8);
|
||||
person.add_measureunits_unit("Bit");
|
||||
person.add_measureunits_coef(1);
|
||||
person.mutable_newmessage()->set_z(91);
|
||||
person.set_nestiness_a_b_c_d(702);
|
||||
google::protobuf::util::SerializeDelimitedToOstream(person, &ss);
|
||||
}
|
||||
|
||||
writeInsertDataQueryForInputTest(ss, "in_persons_00825", "00825_protobuf_format:AltPerson", out);
|
||||
|
||||
{
|
||||
StrPerson person;
|
||||
person.set_uuid("aa0e5a06-cab2-4034-a6a2-48e82b91664e");
|
||||
person.set_name("Leonid");
|
||||
person.set_surname("Kirillov");
|
||||
person.set_gender("male");
|
||||
person.set_birthdate("1983-06-24");
|
||||
person.set_phonenumber("+74950275864");
|
||||
person.set_isonline("1");
|
||||
person.set_visittime("2019-02-04 09:45:00");
|
||||
person.set_age("35");
|
||||
person.set_zodiacsign("cancer");
|
||||
person.add_songs("7 rings");
|
||||
person.add_songs("Eastside");
|
||||
person.add_songs("Last Hurrah");
|
||||
person.add_color("0");
|
||||
person.add_color("0");
|
||||
person.add_color("255");
|
||||
person.set_hometown("San Diego");
|
||||
person.add_location("32.823943");
|
||||
person.add_location("-117.081327");
|
||||
person.set_pi("3.1415927");
|
||||
person.set_lotterywin("15000000");
|
||||
person.set_someratio("186.75");
|
||||
person.set_temperature("-2.1");
|
||||
person.set_randombignumber("20659829331");
|
||||
person.mutable_measureunits()->add_unit("minute");
|
||||
person.mutable_measureunits()->add_coef("60");
|
||||
person.mutable_measureunits()->add_unit("hour");
|
||||
person.mutable_measureunits()->add_coef("3600");
|
||||
person.mutable_nestiness_a()->mutable_b_c()->add_e("1800");
|
||||
google::protobuf::util::SerializeDelimitedToOstream(person, &ss);
|
||||
}
|
||||
|
||||
writeInsertDataQueryForInputTest(ss, "in_persons_00825", "00825_protobuf_format:StrPerson", out);
|
||||
|
||||
{
|
||||
Syntax2Person person;
|
||||
person.set_uuid("3faee064-c4f7-4d34-b6f3-8d81c2b6a15d");
|
||||
person.set_name("Nick");
|
||||
person.set_surname("Kolesnikov");
|
||||
person.set_gender(Syntax2Person::male);
|
||||
person.set_birthdate(10586); // 1998-12-26
|
||||
person.set_photo("bmp");
|
||||
person.set_phonenumber("412-687-5007");
|
||||
person.set_isonline(true);
|
||||
person.set_visittime(1542596399); // 2018-11-19 05:59:59
|
||||
person.set_age(20);
|
||||
person.set_zodiacsign(Syntax2Person::capricorn);
|
||||
person.add_songs("Havana");
|
||||
person.add_color(128);
|
||||
person.add_color(0);
|
||||
person.add_color(128);
|
||||
person.set_hometown("Pittsburgh");
|
||||
person.add_location(40.517193);
|
||||
person.add_location(-79.949452);
|
||||
person.set_pi(3.1415926535898);
|
||||
person.set_lotterywin(50000000000);
|
||||
person.set_someratio(780);
|
||||
person.set_temperature(18.3);
|
||||
person.set_randombignumber(195500007);
|
||||
person.mutable_measureunits()->add_unit("ounce");
|
||||
person.mutable_measureunits()->add_coef(28.35);
|
||||
person.mutable_measureunits()->add_unit("carat");
|
||||
person.mutable_measureunits()->add_coef(0.2);
|
||||
person.mutable_measureunits()->add_unit("gram");
|
||||
person.mutable_measureunits()->add_coef(1);
|
||||
person.mutable_nestiness()->mutable_a()->mutable_b()->mutable_c()->set_d(9494);
|
||||
google::protobuf::util::SerializeDelimitedToOstream(person, &ss);
|
||||
}
|
||||
|
||||
writeInsertDataQueryForInputTest(ss, "in_persons_00825", "00825_protobuf_format_syntax2:Syntax2Person", out);
|
||||
|
||||
{
|
||||
NumberAndSquare ns;
|
||||
ns.set_number(2);
|
||||
ns.set_square(4);
|
||||
google::protobuf::util::SerializeDelimitedToOstream(ns, &ss);
|
||||
}
|
||||
|
||||
{
|
||||
NumberAndSquare ns;
|
||||
ns.set_number(0);
|
||||
ns.set_square(0);
|
||||
google::protobuf::util::SerializeDelimitedToOstream(ns, &ss);
|
||||
}
|
||||
|
||||
{
|
||||
NumberAndSquare ns;
|
||||
ns.set_number(3);
|
||||
ns.set_square(9);
|
||||
google::protobuf::util::SerializeDelimitedToOstream(ns, &ss);
|
||||
}
|
||||
|
||||
writeInsertDataQueryForInputTest(ss, "in_squares_00825", "00825_protobuf_format:NumberAndSquare", out);
|
||||
}
|
||||
|
||||
|
||||
void writeReferenceForOutputTest(std::ostream & out)
|
||||
{
|
||||
{
|
||||
Person person;
|
||||
person.set_uuid("a7522158-3d41-4b77-ad69-6c598ee55c49");
|
||||
person.set_name("Ivan");
|
||||
person.set_surname("Petrov");
|
||||
person.set_gender(Gender::male);
|
||||
person.set_birthdate(4015); // 1980-12-29
|
||||
person.set_photo("png");
|
||||
person.set_phonenumber(std::string("+74951234567\0", 13)); // Converted from FixedString(13)
|
||||
person.set_isonline(true);
|
||||
person.set_visittime(1546703100); // 2019-01-05 18:45:00
|
||||
person.set_age(38);
|
||||
person.set_zodiacsign(ZodiacSign::capricorn);
|
||||
person.add_songs("Yesterday");
|
||||
person.add_songs("Flowers");
|
||||
person.add_color(255);
|
||||
person.add_color(0);
|
||||
person.add_color(0);
|
||||
person.set_hometown("Moscow");
|
||||
person.add_location(55.753215);
|
||||
person.add_location(37.622504);
|
||||
person.set_pi(3.14);
|
||||
person.set_lotterywin(214.10);
|
||||
person.set_someratio(0.1);
|
||||
person.set_temperature(5.8);
|
||||
person.set_randombignumber(17060000000);
|
||||
auto* mu = person.add_measureunits();
|
||||
mu->set_unit("meter");
|
||||
mu->set_coef(1);
|
||||
mu = person.add_measureunits();
|
||||
mu->set_unit("centimeter");
|
||||
mu->set_coef(0.01);
|
||||
mu = person.add_measureunits();
|
||||
mu->set_unit("kilometer");
|
||||
mu->set_coef(1000);
|
||||
person.mutable_nestiness()->mutable_a()->mutable_b()->mutable_c()->set_d(500);
|
||||
person.mutable_nestiness()->mutable_a()->mutable_b()->mutable_c()->add_e(501);
|
||||
person.mutable_nestiness()->mutable_a()->mutable_b()->mutable_c()->add_e(502);
|
||||
google::protobuf::util::SerializeDelimitedToOstream(person, &out);
|
||||
}
|
||||
|
||||
{
|
||||
Person person;
|
||||
person.set_uuid("c694ad8a-f714-4ea3-907d-fd54fb25d9b5");
|
||||
person.set_name("Natalia");
|
||||
person.set_surname("Sokolova");
|
||||
person.set_gender(Gender::female);
|
||||
person.set_birthdate(8102); // 1992-03-08
|
||||
person.set_photo("jpg");
|
||||
person.set_isonline(false);
|
||||
person.set_age(26);
|
||||
person.set_zodiacsign(ZodiacSign::pisces);
|
||||
person.add_color(100);
|
||||
person.add_color(200);
|
||||
person.add_color(50);
|
||||
person.set_hometown("Plymouth");
|
||||
person.add_location(50.403724);
|
||||
person.add_location(-4.142123);
|
||||
person.set_pi(3.14159);
|
||||
person.set_someratio(0.007);
|
||||
person.set_temperature(5.4);
|
||||
person.set_randombignumber(-20000000000000);
|
||||
google::protobuf::util::SerializeDelimitedToOstream(person, &out);
|
||||
}
|
||||
|
||||
{
|
||||
Person person;
|
||||
person.set_uuid("a7da1aa6-f425-4789-8947-b034786ed374");
|
||||
person.set_name("Vasily");
|
||||
person.set_surname("Sidorov");
|
||||
person.set_gender(Gender::male);
|
||||
person.set_birthdate(9339); // 1995-07-28
|
||||
person.set_photo("bmp");
|
||||
person.set_phonenumber("+442012345678");
|
||||
person.set_isonline(true);
|
||||
person.set_visittime(1546117200); // 2018-12-30 00:00:00
|
||||
person.set_age(23);
|
||||
person.set_zodiacsign(ZodiacSign::leo);
|
||||
person.add_songs("Sunny");
|
||||
person.add_color(250);
|
||||
person.add_color(244);
|
||||
person.add_color(10);
|
||||
person.set_hometown("Murmansk");
|
||||
person.add_location(68.970682);
|
||||
person.add_location(33.074981);
|
||||
person.set_pi(3.14159265358979);
|
||||
person.set_lotterywin(100000000000);
|
||||
person.set_someratio(800);
|
||||
person.set_temperature(-3.2);
|
||||
person.set_randombignumber(154400000);
|
||||
auto* mu = person.add_measureunits();
|
||||
mu->set_unit("pound");
|
||||
mu->set_coef(16);
|
||||
person.mutable_nestiness()->mutable_a()->mutable_b()->mutable_c()->set_d(503);
|
||||
google::protobuf::util::SerializeDelimitedToOstream(person, &out);
|
||||
}
|
||||
|
||||
out << "ALTERNATIVE->" << std::endl;
|
||||
|
||||
{
|
||||
AltPerson person;
|
||||
person.add_location(55);
|
||||
person.add_location(37);
|
||||
person.set_pi(3.14);
|
||||
person.set_uuid("a7522158-3d41-4b77-ad69-6c598ee55c49");
|
||||
person.set_name("Ivan");
|
||||
person.set_gender(AltPerson::male);
|
||||
person.set_zodiacsign(1222); // capricorn
|
||||
person.set_birthdate(4015); // 1980-12-29
|
||||
person.set_age("38");
|
||||
person.set_isonline(OnlineStatus::online);
|
||||
person.set_someratio(0.100000001490116119384765625); // 0.1 converted from float to double
|
||||
person.set_visittime(1546703100); // 2019-01-05 18:45:00
|
||||
person.set_randombignumber(17060000000);
|
||||
person.add_color(255);
|
||||
person.add_color(0);
|
||||
person.add_color(0);
|
||||
person.set_lotterywin(214);
|
||||
person.set_surname("Petrov");
|
||||
person.set_phonenumber(+74951234567);
|
||||
person.set_temperature(5);
|
||||
person.add_measureunits_unit("meter");
|
||||
person.add_measureunits_coef(1);
|
||||
person.add_measureunits_unit("centimeter");
|
||||
person.add_measureunits_coef(0.01);
|
||||
person.add_measureunits_unit("kilometer");
|
||||
person.add_measureunits_coef(1000);
|
||||
person.set_nestiness_a_b_c_d(500);
|
||||
person.add_nestiness_a_b_c_e(501);
|
||||
person.add_nestiness_a_b_c_e(502);
|
||||
google::protobuf::util::SerializeDelimitedToOstream(person, &out);
|
||||
}
|
||||
|
||||
{
|
||||
AltPerson person;
|
||||
person.add_location(50);
|
||||
person.add_location(-4);
|
||||
person.set_pi(3.14159);
|
||||
person.set_uuid("c694ad8a-f714-4ea3-907d-fd54fb25d9b5");
|
||||
person.set_name("Natalia");
|
||||
person.set_gender(AltPerson::female);
|
||||
person.set_zodiacsign(219); // pisces
|
||||
person.set_birthdate(8102); // 1992-03-08
|
||||
person.set_age("26");
|
||||
person.set_isonline(OnlineStatus::offline);
|
||||
person.set_someratio(0.007000000216066837310791015625); // 0.007 converted from float to double
|
||||
person.set_randombignumber(-20000000000000);
|
||||
person.add_color(100);
|
||||
person.add_color(200);
|
||||
person.add_color(50);
|
||||
person.set_surname("Sokolova");
|
||||
person.set_temperature(5);
|
||||
google::protobuf::util::SerializeDelimitedToOstream(person, &out);
|
||||
}
|
||||
|
||||
{
|
||||
AltPerson person;
|
||||
person.add_location(68);
|
||||
person.add_location(33);
|
||||
person.set_pi(3.1415926535897);
|
||||
person.set_uuid("a7da1aa6-f425-4789-8947-b034786ed374");
|
||||
person.set_name("Vasily");
|
||||
person.set_gender(AltPerson::male);
|
||||
person.set_zodiacsign(723); // leo
|
||||
person.set_birthdate(9339); // 1995-07-28
|
||||
person.set_age("23");
|
||||
person.set_isonline(OnlineStatus::online);
|
||||
person.set_someratio(800);
|
||||
person.set_visittime(1546117200); // 2018-12-30 00:00:00
|
||||
person.set_randombignumber(154400000);
|
||||
person.add_color(250);
|
||||
person.add_color(244);
|
||||
person.add_color(10);
|
||||
person.set_lotterywin(100000000000);
|
||||
person.set_surname("Sidorov");
|
||||
person.set_phonenumber(+442012345678);
|
||||
person.set_temperature(-3);
|
||||
person.add_measureunits_unit("pound");
|
||||
person.add_measureunits_coef(16);
|
||||
person.set_nestiness_a_b_c_d(503);
|
||||
google::protobuf::util::SerializeDelimitedToOstream(person, &out);
|
||||
}
|
||||
|
||||
out << "STRINGS->" << std::endl;
|
||||
|
||||
{
|
||||
StrPerson person;
|
||||
person.set_uuid("a7522158-3d41-4b77-ad69-6c598ee55c49");
|
||||
person.set_name("Ivan");
|
||||
person.set_surname("Petrov");
|
||||
person.set_gender("male");
|
||||
person.set_birthdate("1980-12-29");
|
||||
person.set_phonenumber(std::string("+74951234567\0", 13)); // Converted from FixedString(13)
|
||||
person.set_isonline("1");
|
||||
person.set_visittime("2019-01-05 18:45:00");
|
||||
person.set_age("38");
|
||||
person.set_zodiacsign("capricorn");
|
||||
person.add_songs("Yesterday");
|
||||
person.add_songs("Flowers");
|
||||
person.add_color("255");
|
||||
person.add_color("0");
|
||||
person.add_color("0");
|
||||
person.set_hometown("Moscow");
|
||||
person.add_location("55.753215");
|
||||
person.add_location("37.622504");
|
||||
person.set_pi("3.14");
|
||||
person.set_lotterywin("214.10");
|
||||
person.set_someratio("0.1");
|
||||
person.set_temperature("5.8");
|
||||
person.set_randombignumber("17060000000");
|
||||
person.mutable_measureunits()->add_unit("meter");
|
||||
person.mutable_measureunits()->add_coef("1");
|
||||
person.mutable_measureunits()->add_unit("centimeter");
|
||||
person.mutable_measureunits()->add_coef("0.01");
|
||||
person.mutable_measureunits()->add_unit("kilometer");
|
||||
person.mutable_measureunits()->add_coef("1000");
|
||||
person.mutable_nestiness_a()->mutable_b_c()->set_d("500");
|
||||
person.mutable_nestiness_a()->mutable_b_c()->add_e("501");
|
||||
person.mutable_nestiness_a()->mutable_b_c()->add_e("502");
|
||||
google::protobuf::util::SerializeDelimitedToOstream(person, &out);
|
||||
}
|
||||
|
||||
{
|
||||
StrPerson person;
|
||||
person.set_uuid("c694ad8a-f714-4ea3-907d-fd54fb25d9b5");
|
||||
person.set_name("Natalia");
|
||||
person.set_surname("Sokolova");
|
||||
person.set_gender("female");
|
||||
person.set_birthdate("1992-03-08");
|
||||
person.set_isonline("0");
|
||||
person.set_age("26");
|
||||
person.set_zodiacsign("pisces");
|
||||
person.add_color("100");
|
||||
person.add_color("200");
|
||||
person.add_color("50");
|
||||
person.set_hometown("Plymouth");
|
||||
person.add_location("50.403724");
|
||||
person.add_location("-4.142123");
|
||||
person.set_pi("3.14159");
|
||||
person.set_someratio("0.007");
|
||||
person.set_temperature("5.4");
|
||||
person.set_randombignumber("-20000000000000");
|
||||
google::protobuf::util::SerializeDelimitedToOstream(person, &out);
|
||||
}
|
||||
|
||||
{
|
||||
StrPerson person;
|
||||
person.set_uuid("a7da1aa6-f425-4789-8947-b034786ed374");
|
||||
person.set_name("Vasily");
|
||||
person.set_surname("Sidorov");
|
||||
person.set_gender("male");
|
||||
person.set_birthdate("1995-07-28");
|
||||
person.set_phonenumber("+442012345678");
|
||||
person.set_isonline("1");
|
||||
person.set_visittime("2018-12-30 00:00:00");
|
||||
person.set_age("23");
|
||||
person.set_zodiacsign("leo");
|
||||
person.add_songs("Sunny");
|
||||
person.add_color("250");
|
||||
person.add_color("244");
|
||||
person.add_color("10");
|
||||
person.set_hometown("Murmansk");
|
||||
person.add_location("68.970682");
|
||||
person.add_location("33.074981");
|
||||
person.set_pi("3.14159265358979");
|
||||
person.set_lotterywin("100000000000.00");
|
||||
person.set_someratio("800");
|
||||
person.set_temperature("-3.2");
|
||||
person.set_randombignumber("154400000");
|
||||
person.mutable_measureunits()->add_unit("pound");
|
||||
person.mutable_measureunits()->add_coef("16");
|
||||
person.mutable_nestiness_a()->mutable_b_c()->set_d("503");
|
||||
google::protobuf::util::SerializeDelimitedToOstream(person, &out);
|
||||
}
|
||||
|
||||
out << "SYNTAX2->" << std::endl;
|
||||
|
||||
{
|
||||
Syntax2Person person;
|
||||
person.set_uuid("a7522158-3d41-4b77-ad69-6c598ee55c49");
|
||||
person.set_name("Ivan");
|
||||
person.set_surname("Petrov");
|
||||
person.set_gender(Syntax2Person::male);
|
||||
person.set_birthdate(4015); // 1980-12-29
|
||||
person.set_photo("png");
|
||||
person.set_phonenumber(std::string("+74951234567\0", 13)); // Converted from FixedString(13)
|
||||
person.set_isonline(true);
|
||||
person.set_visittime(1546703100); // 2019-01-05 18:45:00
|
||||
person.set_age(38);
|
||||
person.set_zodiacsign(Syntax2Person::capricorn);
|
||||
person.add_songs("Yesterday");
|
||||
person.add_songs("Flowers");
|
||||
person.add_color(255);
|
||||
person.add_color(0);
|
||||
person.add_color(0);
|
||||
person.set_hometown("Moscow");
|
||||
person.add_location(55.753215);
|
||||
person.add_location(37.622504);
|
||||
person.set_pi(3.14);
|
||||
person.set_lotterywin(214.10);
|
||||
person.set_someratio(0.1);
|
||||
person.set_temperature(5.8);
|
||||
person.set_randombignumber(17060000000);
|
||||
person.mutable_measureunits()->add_unit("meter");
|
||||
person.mutable_measureunits()->add_coef(1);
|
||||
person.mutable_measureunits()->add_unit("centimeter");
|
||||
person.mutable_measureunits()->add_coef(0.01);
|
||||
person.mutable_measureunits()->add_unit("kilometer");
|
||||
person.mutable_measureunits()->add_coef(1000);
|
||||
person.mutable_nestiness()->mutable_a()->mutable_b()->mutable_c()->set_d(500);
|
||||
person.mutable_nestiness()->mutable_a()->mutable_b()->mutable_c()->add_e(501);
|
||||
person.mutable_nestiness()->mutable_a()->mutable_b()->mutable_c()->add_e(502);
|
||||
google::protobuf::util::SerializeDelimitedToOstream(person, &out);
|
||||
}
|
||||
|
||||
{
|
||||
Syntax2Person person;
|
||||
person.set_uuid("c694ad8a-f714-4ea3-907d-fd54fb25d9b5");
|
||||
person.set_name("Natalia");
|
||||
person.set_surname("Sokolova");
|
||||
person.set_gender(Syntax2Person::female);
|
||||
person.set_birthdate(8102); // 1992-03-08
|
||||
person.set_photo("jpg");
|
||||
person.set_isonline(false);
|
||||
person.set_age(26);
|
||||
person.set_zodiacsign(Syntax2Person::pisces);
|
||||
person.add_color(100);
|
||||
person.add_color(200);
|
||||
person.add_color(50);
|
||||
person.set_hometown("Plymouth");
|
||||
person.add_location(50.403724);
|
||||
person.add_location(-4.142123);
|
||||
person.set_pi(3.14159);
|
||||
person.set_someratio(0.007);
|
||||
person.set_temperature(5.4);
|
||||
person.set_randombignumber(-20000000000000);
|
||||
google::protobuf::util::SerializeDelimitedToOstream(person, &out);
|
||||
}
|
||||
|
||||
{
|
||||
Syntax2Person person;
|
||||
person.set_uuid("a7da1aa6-f425-4789-8947-b034786ed374");
|
||||
person.set_name("Vasily");
|
||||
person.set_surname("Sidorov");
|
||||
person.set_gender(Syntax2Person::male);
|
||||
person.set_birthdate(9339); // 1995-07-28
|
||||
person.set_photo("bmp");
|
||||
person.set_phonenumber("+442012345678");
|
||||
person.set_isonline(true);
|
||||
person.set_visittime(1546117200); // 2018-12-30 00:00:00
|
||||
person.set_age(23);
|
||||
person.set_zodiacsign(Syntax2Person::leo);
|
||||
person.add_songs("Sunny");
|
||||
person.add_color(250);
|
||||
person.add_color(244);
|
||||
person.add_color(10);
|
||||
person.set_hometown("Murmansk");
|
||||
person.add_location(68.970682);
|
||||
person.add_location(33.074981);
|
||||
person.set_pi(3.14159265358979);
|
||||
person.set_lotterywin(100000000000);
|
||||
person.set_someratio(800);
|
||||
person.set_temperature(-3.2);
|
||||
person.set_randombignumber(154400000);
|
||||
person.mutable_measureunits()->add_unit("pound");
|
||||
person.mutable_measureunits()->add_coef(16);
|
||||
person.mutable_nestiness()->mutable_a()->mutable_b()->mutable_c()->set_d(503);
|
||||
google::protobuf::util::SerializeDelimitedToOstream(person, &out);
|
||||
}
|
||||
|
||||
out << "SQUARES->" << std::endl;
|
||||
|
||||
{
|
||||
NumberAndSquare ns;
|
||||
ns.set_number(0);
|
||||
ns.set_square(0);
|
||||
google::protobuf::util::SerializeDelimitedToOstream(ns, &out);
|
||||
}
|
||||
|
||||
{
|
||||
NumberAndSquare ns;
|
||||
ns.set_number(2);
|
||||
ns.set_square(4);
|
||||
google::protobuf::util::SerializeDelimitedToOstream(ns, &out);
|
||||
}
|
||||
|
||||
{
|
||||
NumberAndSquare ns;
|
||||
ns.set_number(3);
|
||||
ns.set_square(9);
|
||||
google::protobuf::util::SerializeDelimitedToOstream(ns, &out);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void parseCommandLine(int argc, char ** argv, std::string & output_dir)
|
||||
{
|
||||
namespace po = boost::program_options;
|
||||
po::options_description desc;
|
||||
output_dir = OUTPUT_DIR;
|
||||
desc.add_options()
|
||||
("help,h", "Show help")
|
||||
("directory,d", po::value<std::string>(&output_dir),
|
||||
"Set the output directory. By default it's " OUTPUT_DIR);
|
||||
po::parsed_options parsed = po::command_line_parser(argc, argv).options(desc).run();
|
||||
po::variables_map vm;
|
||||
po::store(parsed, vm);
|
||||
po::notify(vm);
|
||||
if (!output_dir.empty())
|
||||
return;
|
||||
|
||||
// Show help.
|
||||
std::cout << "This utility generates delimited messages for tests checking protobuf IO support." << std::endl;
|
||||
std::cout << desc;
|
||||
std::cout << "Example:" << std::endl;
|
||||
std::cout << argv[0] << " -g OUTPUT_REFERENCE" << std::endl;
|
||||
std::exit(0);
|
||||
}
|
||||
|
||||
void writeFile(const std::string & filepath, void (*fn)(std::ostream &))
|
||||
{
|
||||
std::cout << "Writing '" << filepath << "' ... ";
|
||||
std::fstream out(filepath, std::fstream::out | std::fstream::trunc);
|
||||
fn(out);
|
||||
std::cout << "done." << std::endl;
|
||||
}
|
||||
|
||||
int main(int argc, char ** argv)
|
||||
{
|
||||
std::string output_dir;
|
||||
parseCommandLine(argc, argv, output_dir);
|
||||
writeFile(output_dir + "/00825_protobuf_format_input.insh", writeInsertDataQueriesForInputTest);
|
||||
writeFile(output_dir + "/00825_protobuf_format_output.reference", writeReferenceForOutputTest);
|
||||
return 0;
|
||||
}
|
Loading…
Reference in New Issue
Block a user